︿
Top

2022年11月5日 星期六

ASP.NET Core 6 cross-platform beginner study (asp.net core 6 跨平台初探)

前言

話說 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 截圖
    ubuntu firefox self-signed cert error

  • how to set ubuntu default browser to edge 截圖
    change ubuntu default browser

  • 以下描述 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 physical ip HTTP  OK

  • ubuntu HTTPS physical ip NG 截圖
    ubuntu physical ip HTTPS NG

關卡4: 跨越主機的限制

VirtualBox 有不同的網卡種類可以使用, 讓 HOST (Windows 10) 可以存取 GUEST (Ubuntu) 上的資源. 例如:

  • NAT: 可以設定 Port Forwarding
    virtualbox NAT port forwarding

  • Host-Only:
    virtualbox Host-Only

以下是利用 NAT port forwarding 的截圖

  • HTTP: OK windows 10  NAT HTTP OK

  • HTTPS: NG windows 10  NAT HTTPS NG

關卡5: 採用真正的憑證

預計有空時, 再參考 will 保哥的文件, 以 OpenSSL 建立自簽憑證; 並將 Kestrel 置於 apache 或 nginx 的後端.

參考文件

virtualbox networking modes

沒有留言:

張貼留言