天天看點

使用Apache搭建https服務,單向認證+雙向認證。

渣科最近學習Apache, 學會了怎麼搭建單向和雙向的https服務,文中所有步驟親測有效,希望能夠幫助大家!

先放張圖,為了這個鎖頭,我奮鬥了很久。使用的是自簽名證書,域名也是在本地配的,全程不需要聯網。

使用Apache搭建https服務,單向認證+雙向認證。

這是我的Apache版本:httpd-2.4.41-lre302-x64-vc14。希望大家可以先了解https怎麼通信,減少配置過程中的一些疑惑:

 https://www.runoob.com/w3cnote/http-vs-https.html

      0. 搭建好Apache,就可以通路我們的網站。

下載下傳安裝教程:https://blog.csdn.net/mikasoi/article/details/80976425

安裝完成,打開http://127.0.0.1,可以看到Apache的歡迎頁面。

使用Apache搭建https服務,單向認證+雙向認證。

恭喜,你已經搭好了一個http服務了!

為了配置HTTPS,我們還需要一點點的準備工作。

           簡單介紹一下Apache三個配置檔案(不想看可以直接繞過,去查官網的會說的更仔細):

  • httpd.conf 是核心的配置檔案,我們可以在裡面添加或删除Apache的功能子產品(比如mod_proxy就是代理子產品)。

httpd.conf中的LISTEN用來表示Apache監聽的端口,預設是80。

  • extra/httpd-vhost.conf,我們一般不會在httpd.conf中直接寫我們的配置,而是把配置轉移到httpd-vhost.conf中,讓httpd.conf保留最幹淨的配置和功能(添加/删除功能子產品,或者定義全局屬性)。httpd-vhost.conf用來進行虛拟機配置,虛拟機配置就是一個标簽<VirtualHost>,你可以把很多指令配置到一個<VirtualHost>,這些指令隻對此<VirtualHost>生效,下面配置的時候會說到。
  • extra/httpd-ssl.conf,關于SSL的全局配置就寫在這裡面。當我們使用HTTPS的時候就會用到這裡面的全局配置。有全局自然也有局部,你可以在自己的Virtualhost中重寫這些配置。
  •  為了友善測試,本文用到的域名和證書都在本機生成和設定,模拟生産實際環境。

域名通過修改C:\Windows\System32\drivers\etc\hosts 檔案。

比如www.myApahce.com是我要測試域名,那麼我就在裡面加上這行。

使用Apache搭建https服務,單向認證+雙向認證。

試試通路:

使用Apache搭建https服務,單向認證+雙向認證。

自簽名證書生成網上有很多資料,下面我也會說到。

  1. 開始部署一個Https服務。

最終的效果:

使用Apache搭建https服務,單向認證+雙向認證。

1.1 Https分為單向驗證和雙向驗證。

這裡我簡單說明一下,HTTPS單向驗證,就是隻有服務端證書,用戶端驗證服務端證書的真僞後即可進行通信。HTTPS雙向驗證,用戶端驗證服務端身份後,還要把用戶端證書發給服務端,服務端也要驗證用戶端身份,通過後才進行通信。

我們先部署一個單向https服務,再基于單向HTTPS 配置 雙向的https服務。

1.2 有關于HTTPS的配置,都依賴于mod_ssl子產品,這個子產品在我們安裝Apache的時候預設就打開了。打開httpd.conf中可以看到:

使用Apache搭建https服務,單向認證+雙向認證。

如果加載了mod_ssl,預設也會加載httpd-ssl.conf檔案,httpd-ssl.conf裡有關于ssl的全局配置:

使用Apache搭建https服務,單向認證+雙向認證。

1.3 開始部署一個單向驗證的Https服務。

1.3.1 證書準備,我們要生成Https需要的相關證書,這裡使用java的keytool工具生成我們的相關證書,用什麼工具不重要,隻要能拿到證書就行。

           > 生成私鑰證書庫[注意指令中的路徑名,如果你沒有D盤記得修改路徑]:

keytool -genkeypair -alias apache -keysize 2048 -keyalg RSA -validity 60 -keystore D:\apache.jks -storetype JKS -ext SAN=DNS:www.myApache.com

使用Apache搭建https服務,單向認證+雙向認證。

> 将證書庫從keystore類型轉成p12類型: keytool -importkeystore -srckeystore D:\apache.jks -destkeystore D:\apache.p12 -srcstoretype jks -deststoretype pkcs12 -alias apache

            > 從庫中導出 私鑰和證書給apache。

               如果提示沒有OPENSSL這個指令,請下載下傳OPENSSL。

              https://blog.csdn.net/sunhuansheng/article/details/82218678

              #####秘鑰不加密,不要證書,隻要私鑰。

  openssl pkcs12 -in D:\apache.p12 -nodes -nocerts -out D:\apache.key

              #####不要私鑰,導出證書鍊。

openssl pkcs12 -in D:\apache.p12 -out D:\apache.pem -nokeys

          > 從庫中導出根證書 給浏覽器安裝

 keytool -export -alias apache -keystore D:\apache.jks -file D:\apache.cer

> apache.key和apache.pem是給Apache部署https使用,apache.cer是給用戶端校驗伺服器身份時使用。

打開你的D盤,看到這些檔案。

使用Apache搭建https服務,單向認證+雙向認證。

1.3.2 Apache準備,我們建立一個端口8888,讓8888成為https服務。

> 在httpd.conf檔案中 加上LISTEN 8888.

使用Apache搭建https服務,單向認證+雙向認證。

> 在httpd.conf中去掉httpd-vhosts.conf前面的注釋,預設是有注釋的:

使用Apache搭建https服務,單向認證+雙向認證。

> 在httpd-vhost.conf中加上這段虛拟機配置,它作用在ip=127.0.0.1,端口号為8888上面:

<VirtualHost 127.0.0.1:8888>

    ServerAdmin [email protected]

    ServerName  www.myApache.com      

 SSLEngine On

SSLCertificateFile "D:/apache.pem"

SSLCertificateKeyFile "D:/apache.key"

</VirtualHost>

SSLEngine On表示開啟HTTPS服務,

SSLCertificateFile是證書的公鑰檔案位置,SSLCertificateKeyFile是證書的私鑰位置。

1.3.3 用戶端準備,安裝證書用來校驗伺服器,輕按兩下apache.cer,安裝證書到 信賴的根證書。

使用Apache搭建https服務,單向認證+雙向認證。
使用Apache搭建https服務,單向認證+雙向認證。

一路點選Next,直到Finish。

1.3.4 驗收成果,重新開機Apache, 然後關閉所有開着的浏覽器,打開一個新的浏覽器,

輸入https://www.myApache.com:8888/,就可以發現https部署成功,可以看到我們漂亮的鎖頭。太棒了!你成功了!

這是chrome:

使用Apache搭建https服務,單向認證+雙向認證。

這是IE:

使用Apache搭建https服務,單向認證+雙向認證。

1.4  在https單向的基礎上,完成的Https雙向的配置。就是用戶端也必須有一個證書,提供給服務端校驗,效果:

部署https雙向認證後,當你再次通路https://www.myApache.com:8888時,會提示你沒有用戶端證書。

使用Apache搭建https服務,單向認證+雙向認證。

你必須在浏覽器安裝一個用戶端證書,選擇證書後,才能通路。

使用Apache搭建https服務,單向認證+雙向認證。

1.4.1 證書準備:這裡驗證用戶端所需要的證書,我們使用上面生成的apache.pem,apache.pk12,

首先聲明,服務端證書和用戶端證書之間是沒有半毛錢關系的,這裡我是為了友善,直接使用了服務端證書 同時作為用戶端證書,你也再可以生成一份新的證書作為用戶端證書!

1.4.2 Apache配置,在上面的VirtualHost中,加上一段用戶端認證的配置:

<VirtualHost 127.0.0.1:8888>

    ServerAdmin [email protected]

    ServerName  www.myApache.com      

               SSLEngine On

SSLCertificateFile "D:/apache.pem"

SSLCertificateKeyFile "D:/apache.key"

SSLVerifyClient  require

SSLCACertificateFile "D:/apache.pem"

</VirtualHost>

          服務端Apahce通過SSLVerifyClient  true知道了要檢驗用戶端身份,通過SSLCACertificateFile知道了服務端信賴的證書是哪些。

          1.4.3 用戶端準備,用戶端要帶着證書去通路服務端,在浏覽器中加入apache.pk12到個人證書中。

> 打開chrome浏覽器:

使用Apache搭建https服務,單向認證+雙向認證。

> 導入我們的apache.pk12:

使用Apache搭建https服務,單向認證+雙向認證。
使用Apache搭建https服務,單向認證+雙向認證。
使用Apache搭建https服務,單向認證+雙向認證。

> 輸入PK12檔案的密碼,之後一直點next,然後儲存。

使用Apache搭建https服務,單向認證+雙向認證。
使用Apache搭建https服務,單向認證+雙向認證。

1.4.4 驗收成果,重新開機Apache,關閉所有浏覽器,重新輸入https://www.myApache.com:8888 .你可以看到會彈出一個 用戶端證書的選擇,

使用Apache搭建https服務,單向認證+雙向認證。

選擇證書後點選确定,就可以通路到了!

使用Apache搭建https服務,單向認證+雙向認證。

恭喜!使用Apache搭建https雙向認證服務,你做到了!

渣科 用了很久的時間才基本搞明白什麼是HTTPS,單向認證和雙向認證,反向代理,以及Apache一些重要的指令,希望大家也不要操之過急。弄懂了一些基本知識之後才開始進行實際的操作配置,但還是遇到了很多的問題,坎坎坷坷,到最後終于配置成功,還是很開心的,過程中涉及到的一些知識如果大家沒有明白,最好還是先去查一下,我的建議是,看完到不懂的再去官網看描述或者檢視别的部落格。

什麼是https(這篇文章隻是講了單向的https): https://www.runoob.com/w3cnote/http-vs-https.html

什麼是keytool:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html

Apache的指令:http://httpd.apache.org/docs/2.4/mod/directives.html

還有一個很好,值得思考的問題:https://www.v2ex.com/amp/t/411144

//加油吧,渣科。