.Net Core和Jexus配置HTTPS服務

花了幾天時間,看了好多篇博客,終於搞定了網站的HTTPS服務,藉此寫篇博客,來讓有須要的朋友少走彎路。java

1、環境介紹

  一、Linux下在Docker容器中部署好了一個網站,該網站須要經過外部提供程序訪問微軟的登陸平臺,利用的是OAuth2.0協議,所以要求必需要使用SSL服務,也使得網站必需要加入HTTPS服務。安全

  

 

  二、容器外,宿主機上經過jexus作端口轉發。(本沒打算用到jexus,可是看到情形不對,仍是必須把它拉入進來)服務器

  三、HTTPS服務須要證書,經過在騰訊雲上申請免費證書https://console.cloud.tencent.com/ssl,一天以內即可申請到,注意了!!!,假如說使用的和我同樣也是用的jexus,而騰訊雲提供的證書下載包裏面沒有jexus,只有IIS、Nginx、Apache..等等,微信

  

  咱們是能夠直接利用Nginx的兩個文件。第一個是crt文件,第二個是key文件。tcp

  

  假如說你須要pfx結尾的文件那麼能夠經過這兩個文件進行合成生成pfx文件能夠經過命令:微信支付

openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt

   將其中文件名更改成你的文件名便可。又或者度娘上也有將內容粘貼進去而後自動生成的網站,不要敲命令的,這就再也不提供網站了。網站

 

2、全配置

   首先,我想說下,我在jexus中配置了HTTPS服務,在Docker容器中運行的網站中也配置好了HTTPS服務。如同此圖:ui

  

  可能有人會想,爲何都要配置,只配置jexus就足夠了啊。固然,配置jexus是足夠了,可是個人網站裏面若是須要調用好比OAuth2.0協議支持的網站時,回掉地址老是會是用的HTTP協議,開發環境下沒問題,可是一旦弄上域名或是IP地址訪問,那麼生成的就是HTTP的協議了。url

  具體就是在此處.我經過配置好了微軟的外部提供程序,當點擊按鈕後將跳轉到微軟登陸頁面:spa

 

  跳轉後,當前登陸頁面的url中寫明瞭一些參數是咱們想要的,好比redirect_url,此時我已經配置好了網站上的HTTPS協議,在沒有配上時,該處的redirect_url一直都是HTTP的

  好了,開始配置HTTPS服務:

  一、在.Net Core中配置HTTPS協議

    首先,這裏可能要搞清楚一下,jexus和網站之間的請求轉發,這也是我想弄清楚的一個問題,jexus端口轉發請求的時候是否是仍是HTTPS協議的,仍是說只是請求轉發,到了網站中又變成了HTTP了。就如這個模型,在jexus轉發以後,進入kestrel後是HTTP協議的仍是HTTPS協議的? 但願各位博友幫忙,我沒有找到參考資料。

    

   我能作的就是在我嘗試在kestrel中不配置HTTPS協議下,訪問網站雖然也是可以成功的,可是當經過微軟的第三方登陸成功後回調地址訪問網站時,便會是使用的HTTP協議,也就會出問題,與OAuth要求使用SSL的服務必須使用HTTPS協議相矛盾,也就促使着我必需要在kestrel中配置好HTTPS協議。具體配置以下:

  在Program.cs文件中,加入前面所合成的pfx文件,便可,這種情形下,要求個人每個容器中的運行的網站都須要使用證書了。同時注意,在此處不可以使用.UseUrls("https:"//:443")來設置HTTPS服務,在沒有配置.UseKestrel()下是會報錯的,望注意!。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using System.Security.Cryptography.X509Certificates;
using System.Net;
using Identity.Api.Web.Core;

namespace Identity.Api
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                //.UseJexusIntegration()
                .UseKestrel(options =>
                {
                    options.Listen(IPAddress.Any, 1101, listenOptions =>
                    {
                        var certificate = new X509Certificate2("hdshopserver.pfx", "你的證書密碼");
                        listenOptions.UseHttps(certificate);
                    });
                })
                .UseStartup<Startup>()
                .Build();
    }
}

 

 

  二、在jexus上配置HTTPS協議(假如說用的不是jexus或是沒有用到jexus,則可跳過此處)

    首先,經過命令查看到個人jexus版本是5.8.3,是支持HTTPS的了。

    

    進入你的jexus配置文件夾,我用圖形表示更加直觀點:

     

    具體的jexus的各類文件功能再也不介紹,此處只針對配置證書服務,須要查看可看http://blog.csdn.net/yang1982_0907/article/details/45155765

    咱們能夠在jws.conf中配置整個服務器上的全部網站都令其使用HTTPS服務:

    

    也可在siteconf中配置你須要的單獨的網站中使用HTTPS服務:

    

    經過UseHttps=true和配置好前面所提到的兩個文件,jexus的HTTPS服務算是搞定了.而後能夠經過https://域名進行查看,假如說不能成功,能夠在jexus文件夾下的log文件中查看信息,這很關鍵!!。

    在jexus的配置上還須要感謝@無語1994的幫助,剛配置時,用的是本身在服務器上經過命令生成的證書,無論怎樣,都不能看到到網站頁面,而後經過使用騰訊雲上的證書,擺平!

   經過兩次配置後個人網站即可使用HTTPS服務了,也所以,在使用微軟的外部提供程序上登陸微軟第三方頁面也就沒問題了,能夠正常回調顯示了。

   如想查看,能夠訪問https://www.hdshop.xyz:1101/。經過登陸按鈕調用微軟登陸頁面。

3、我的總結

   在配置方面,走了很多彎路,首先是隻是想到在網站中進行配置,可是嘗試起來發現,當我將jexus關閉後sh /usr/jexus/jws stop,也就是直接將網站面向外網,能夠進行訪問成功。

  

  此時,每一個容器中的網站都各自配置了HTTPS服務,可是想到這裏便會感受每一個網站都配置的話,有點冗餘,那麼直接在jexus上配置呢。固然能夠,

  

  經過在jexus上配置完畢,去掉每一個網站上各自配置的HTTPS服務,假如說一個網站不須要使用到諸如OAuth、微信支付等等要求安全性比較高的,那麼jexus上配置HTTPS服務也就足夠了,可是在使用到那些安全性要求後,自身網站也要配置起HTTPS服務。也就所以,我被困了好多天,最終的效果是:

   

 

4、留下問題求助

  第一個問題即是在以前提到的那張圖中:

  

  jexus和kestrel之間仍然是以什麼方式進行傳遞,我看到是利用的tcp,可是舉個例子,用戶訪問的URL是https://xxx.com進入jexus,服務轉交到kestrel,在kestrel中接收的是https://xxx.com仍是http://xxx.com,仍是說其餘的方式。

   第二個問題即是在配置過程當中,看到微軟提供的HTTP重定向到HTTPS的解決方案,意思是說我經過http訪問後會將http的訪問請求轉變成https的訪問請求嗎?也就是說支持http和https的兩種方式,是否?

 

2018-2-25,望技術有成後能回來看見本身的腳步
相關文章
相關標籤/搜索