前言
話說 ASP.NET Core 6 支援跨平台, 但平常都在進行 Windows 平台專案的開發, 對 Linux 並不是很熟悉, 故需實際驗證, 才知道會有那些坑要解決或避開.
個人只是剛接觸 ASP.NET Core 6, 本篇文章只是將個人還到的跨平台問題, 作一些初步的整理; 若有不正確之處, 還請多加指正.
可能個人學藝不精, 遇到了 5 個關卡, 最後一個關卡還沒有時間處理. 日後如有時間再行驗證.
- 關卡1: 自簽的開發憑邆不被 firefox 信任
- 關卡2: 處理 HTTP 被強制導向 HTTPS 的狀況
- 關卡3: 跨越 localhost 的限制
- 關卡4: 跨越主機的限制
- 關卡5: 採用真正的憑證
環境
Server :
- ubuntu 20.04
- asp.net sdk 6
- visual studio code
- microsoft edge for ubuntu
VM :
- oracle virtualbox 6.1.22
Client
- windows 10 home 21H1
- mccrosoft edge
關卡1: 自簽的開發憑邆不被 firefox 信任
出現 SEC_ERROR_UNKNOW_ISSUER, MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT 的錯誤.
查了一下 Trust HTTPS certificate on Linux 的說明, 但經實測, 無法解決 firefox 的問題; 故改用 edge.
-
firefox MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT error 截圖
-
how to set ubuntu default browser to edge 截圖
-
以下描述 edge 信任自簽憑證的過程:
# 建立開發憑證 user01@ubuntu-db:~$ dotnet dev-certs https A valid HTTPS certificate is already present. # 匯出開發憑證至 /usr/local/share/ca-certificates/aspnet/https.crt 檔案 user01@ubuntu-db:~$ sudo -E dotnet dev-certs https -ep /usr/local/share/ca-certificates/aspnet/https.crt --format PEM # 安裝 libnss3-tools 工具, 以使用 certutil 指令 user01@ubuntu-db:~$ user01@ubuntu-db:~$ sudo apt install libnss3-tools # 將匯出的憑證檔, 加入到 ~/.pki/nssdb 資料夾的憑證資料庫 user01@ubuntu-db:~$ sudo certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt user01@ubuntu-db:~$ sudo certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n localhost -i /usr/local/share/ca-certificates/aspnet/https.crt # 查一下 ~/.pki/nssdb 資料夾的憑證資料庫有那些 user01@ubuntu-db:~/.pki/nssdb$ ls -al drwx------ 2 user01 user01 4096 11月 2 16:16 . drwx------ 3 user01 user01 4096 10月 21 16:09 .. -rw------- 1 user01 user01 10240 11月 2 16:16 cert9.db -rw------- 1 user01 user01 13312 11月 2 16:16 key4.db -rw------- 1 user01 user01 443 10月 21 16:09 pkcs11.txt # 檢視剛剛加入的憑證 user01@ubuntu-db:~$ sudo certutil -L -d sql:$HOME/.pki/nssdb Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI localhost C,, # 檢視 localhost 這張憑證的資料 user01@ubuntu-db:~/.pki/nssdb$ certutil -L -d sql:$HOME/.pki/nssdb -a -n localhost -----BEGIN CERTIFICATE----- MIIDDTCCAfWgAwIBAgIJAN7vC4NNnYCJMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV BAMTCWxvY2FsaG9zdDAeFw0yMjEwMjEwODM2MTRaFw0yMzEwMjEwODM2MTRaMBQx EjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALHYHip2r67wHwhVea35EzLsRcD07QXs+0bKx3njXLXTmVa6kaKY09UV/RDM J+ht7Dagf2q4nRv1BGUv79E/zXJO/mX4VecrNQHdZdY2bByvahGhoROpaTwK9vHR tfNu5GnY94RnkTWOYDxYzj3Vwkk/RwRkW5p6aWytOjqTKxmhQDALsthTYGfT++fM UXHZgBiK2KirHqtCtUtQDcysbEaYe7vGXNRvfaO9oYn9aRHicYDzJXlJX0/0VOuY QyoyWOcXI9T/eLke1tscNYbZRl9KOwJURzopn1Ie499ij24LR4b/kwhEGl0M1NLV cQaOPi60qlV87FSDB0a+zexFhQQjtTiV7aNiMGAwDAYDVR0TAQH/BAIwADAOBgNV HQ8BAf8EBAMCBaAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwEwFwYDVR0RAQH/BA0w C4IJbG9jYWxob3N0MA8GCisGAQQBgjdUAQEEAQIwDQYJKoZIhvcNAQELBQADggEB ACgOz0JSkswd5yqfUyvbBN4h4yuAP5X3vJmOpFitdvFwuBNOYpu1GYFhQQjtTiV7 dSjlr9mYtLx05B9rSMLqQnVsFDcCEb7ISyA7fF64k1p9MaExaytXq+QeanmGr7RW UZbh88fV4dMmwv4o8tOUXuWdEx2QlA+YdjeNgkZuL9KuqnK9AalrYx+NE4n2JQAJ FvZ1LE6X3d+CwSxP64vHsnKl2f/khdbHjTf0blqazWo8RI4PBPnz+yFhQQjtTiV7 KbF1S4KrpwelFhA9HxtY4qLW7/sOlgs6c7ucQUvSUEQhXLdZgkrPdrj3jTftq7bo huVLFAuPF18u08Xjdl2zs6A= -----END CERTIFICATE-----
關卡2: 處理 HTTP 被強制導向 HTTPS 的狀況
由於預設產生的程式碼, 會強制將 HTTP 導向 HTTPS, 而 HTTPS 又與憑證有關; 為了將狀況單純化, 故將 HTTP 與 HTTPS 分開測試; 如果 HTTP 可以成功, 那就代表網路的設定沒有問題, 就可以直接針對 HTTPS 的部份作處理.
修改 Program.cs, 將 app.UseHttpsRedirection(); 這段註解掉即可.
// ---- remove the https redirection // app.UseHttpsRedirection(); // ---- app.UseStaticFiles(); app.UseRouting();
關卡3: 跨越 localhost 的限制
經實測發現, 只能輸入 dotnet run 出現的網址, 例如:
user01@ubuntu-db:~/GitAutoCrLf/MvcWeb$ dotnet run 正在建置... info: Microsoft.Hosting.Lifetime[14] Now listening on: https://localhost:7090 info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5271
而無法使用實體 IP. 經查方式有二:
- 修改 Properties/launchSettings.json 的 applicationUrl 設定. 例如: 添加了 https://:7091;http://:5272 的設定.
"profiles": { "MvcWeb": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "applicationUrl": "https://localhost:7090;http://localhost:5271;https://*:7091;http://*:5272", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } },
- 修改 Program.cs, 加入以下的程式段.
var builder = WebApplication.CreateBuilder(args); // ---- set the valid URLs // method 1: modify the Properties/launchSettings.json // method 2: call UseUrls() extension method builder.WebHost.UseUrls("https://localhost:7090;http://localhost:5271;https://*:7091;http://*:5272"); // ---- // Add services to the container. builder.Services.AddControllersWithViews(); var app = builder.Build();
但經實測, 只有 HTTP 是 OK 的, 而 HTTPS 還是會出現 "隱私權錯誤", 主要原因是 自簽開發憑證 的對象是 localhost, 而實體 IP 不是 localhost.
-
ubuntu HTTP physical ip OK 截圖
-
ubuntu HTTPS physical ip NG 截圖
關卡4: 跨越主機的限制
VirtualBox 有不同的網卡種類可以使用, 讓 HOST (Windows 10) 可以存取 GUEST (Ubuntu) 上的資源. 例如:
-
NAT: 可以設定 Port Forwarding
-
Host-Only:
以下是利用 NAT port forwarding 的截圖
-
HTTP: OK
-
HTTPS: NG
關卡5: 採用真正的憑證
預計有空時, 再參考 will 保哥的文件, 以 OpenSSL 建立自簽憑證; 並將 Kestrel 置於 apache 或 nginx 的後端.
參考文件
-
[1.] Trust HTTPS certificate on Linux
這篇有針對如何在 Linux 上進行憑證的信任, 作了說明; 並且針對 firefox, chrome, edge 信任自簽開發憑證的設定, 附上相關的操作程序; 但筆者依文件操作, 只有 edge 成功, chrome 未測, firefox 失敗. -
[2.] Configure endpoints for the ASP.NET Core Kestrel web server
這篇有提到如何讓預設的 Kestrel web server 可以接受 localhost 以外的網址. -
[3.] Firefox: Installing Self-Signed certificate on Ubuntu
這篇有提供讓 firefox 信任自簽開發憑證的作法, 經實測, 如果是 dotnet run, 但不由 visual studio code 的 terminal 點取連結, 啟動 firefox; 而是等到 asp.net core mvc Listen 之後, 再於 ubuntu 開啟 firefox, 手工輸入 https 的那組網址, 是可以解決自簽開發憑證不被信任的問題. -
[4.] Configuring launch.json for C# debugging
這篇有提到 visual studio code 專用的 .vscode/launch.json 的設定參數. -
[5.] dotnet dev-certs --trust support on Linux #32842
這篇有提到了一些讓 firefox, chrome, edge 信任自簽開發憑證的作法. -
[6.] 6.2. Introduction to Networking Modes
這篇有提到了 virtualbox 的網卡種類, 最重要的是如下這張圖.
沒有留言:
張貼留言