NET Core Kestrel部署HTTPS 一個伺服器綁一個證書 一個伺服器綁多個證書

FreeTimeWorker發表於2020-08-25

 .net core 3.0 網站釋出到centos後,繫結ssl證書,一個伺服器綁一個證書,一個伺服器綁多個證書

開始之前:對於windows伺服器不存在這個問題,在iis中繫結證書是非常簡單的一件事,不是本篇部落格討論的範圍,繫結多個證書一樣

3.0中指定url的方式可以通過在配置檔案中加urls:"http://*:5000"這種方式來指定

釋出到centos的.net core網站我是用 Kestrel託管的。這裡也只針對這一種情況進行描述

1,在program.cs中CreateHostBuilder 替換成如下內容:

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>()
                    .UseKestrel((context, options) =>
                    {
                        options.Configure(context.Configuration.GetSection("Kestrel"));
                    });
                });

這段程式碼描述的是Kestrel服務的option從配置檔案中讀取 

緊接著在startup中增加 app.UseHttpsRedirection(); app.UseHsts();//預設是開啟的,如果是,就不用管它

2,在配置檔案appsettings.json中增加,這是單獨的配置節點 ,其中path,是pfx檔案的位置,password是證書的密碼,在阿里雲申請的證書,下載iis版的就有這兩

  "Kestrel": {
    "Limits": {
      "MaxRequestBodySize": 9223372036854775807,
      "MaxRequestBufferSize": 9223372036854775807,
      "MaxRequestLineSize": 9223372036854775807
    },
    "Endpoints": {
      "Https": {
        "Url": "https://*:443",
        "Certificate": {
          "Path": "/home/cert/www.xxxx.pfx",
          "Password": "xxx"
        }
      }
    }
  }

這裡的配置項可以參考微軟的文件,基本上大多數需要程式碼顯式指定的配置在appsettings.json中都是可以直接配置的

參考文件地址:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1#endpoint-configuration

如果一臺伺服器裡邊只有一個需要ssl證書的網站,那麼到這裡,問題就解決了。

很不幸,我的目標是在一臺伺服器裡邊使用兩個ssl證書,分別對兩個網站做ssl傳輸加密,在查過微軟的部分文件後,沒有找到相關的解決方案,反而是找到了nginx。在linux用nginx可以解決一臺伺服器繫結兩個ssl的問題

首先是安裝:yum install nginx,一路y,安裝完畢後,nginx的主配置檔案是   /etc/nginx/nginx.conf 直接修改這個檔案,分別對N個需要ssl的站點進行配置,如下,監聽埠都是443,區別是server_name ,根據需要配置的域名,分別寫對應的server_name,

加粗部分是需要特別關注的,pem,和key這兩 如果是在阿里雲申請的ssl,下載的時候選擇 nginx版的,就包含下邊需要的兩檔案,可以放到任意位置,這裡填寫的是這兩檔案的路徑,location裡邊的內容是轉發的本地埠對應的就是域名對應的子網站。子網站必須是釋出了的,可訪問的站點,另外需要特別注意一下子網站不需要任何證書,只需要可以訪問即可

server {
       listen 443;
       server_name serverName1.com;
       ssl on;
       root '/';
       ssl_certificate 'xxxx.pem';
       ssl_certificate_key 'xxxx.key';
       ssl_session_cache shared:SSL:1m;
       ssl_session_timeout  10m;
       ssl_ciphers PROFILE=SYSTEM;
       ssl_prefer_server_ciphers on;
       include /etc/nginx/default.d/*.conf;
       location / {
            proxy_pass http://127.0.0.1:5000;
       }
       error_page 404 /404.html;
           location = /40x.html {
       }

       error_page 500 502 503 504 /50x.html;
           location = /50x.html {
       }
   }
server {
       listen 443;
       server_name serverName2.com;
       ssl on;
       root '/';
       ssl_certificate 'xxxx.pem';
       ssl_certificate_key 'xxxx.key';
       ssl_session_cache shared:SSL:1m;
       ssl_session_timeout  10m;
       ssl_ciphers PROFILE=SYSTEM;
       ssl_prefer_server_ciphers on;
       include /etc/nginx/default.d/*.conf;
       location / {
            proxy_pass http://127.0.0.1:5001;
       }
       error_page 404 /404.html;
           location = /40x.html {
       }

       error_page 500 502 503 504 /50x.html;
           location = /50x.html {
       }
   }

 

然後啟動nginx服務  systemctl restart nginx.service .如果配置檔案寫的有問題,服務會啟動失敗,錯誤日誌位置在nginx.conf中可以找到

服務啟動完畢後,就可以看到效果了

相關文章