渣科最近學習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的歡迎頁面。
恭喜,你已經搭好了一個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是我要測試域名,那麼我就在裡面加上這行。
試試通路:
自簽名證書生成網上有很多資料,下面我也會說到。
- 開始部署一個Https服務。
最終的效果:

1.1 Https分為單向驗證和雙向驗證。
這裡我簡單說明一下,HTTPS單向驗證,就是隻有服務端證書,用戶端驗證服務端證書的真僞後即可進行通信。HTTPS雙向驗證,用戶端驗證服務端身份後,還要把用戶端證書發給服務端,服務端也要驗證用戶端身份,通過後才進行通信。
我們先部署一個單向https服務,再基于單向HTTPS 配置 雙向的https服務。
1.2 有關于HTTPS的配置,都依賴于mod_ssl子產品,這個子產品在我們安裝Apache的時候預設就打開了。打開httpd.conf中可以看到:
如果加載了mod_ssl,預設也會加載httpd-ssl.conf檔案,httpd-ssl.conf裡有關于ssl的全局配置:
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
> 将證書庫從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盤,看到這些檔案。
1.3.2 Apache準備,我們建立一個端口8888,讓8888成為https服務。
> 在httpd.conf檔案中 加上LISTEN 8888.
> 在httpd.conf中去掉httpd-vhosts.conf前面的注釋,預設是有注釋的:
> 在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,安裝證書到 信賴的根證書。
一路點選Next,直到Finish。
1.3.4 驗收成果,重新開機Apache, 然後關閉所有開着的浏覽器,打開一個新的浏覽器,
輸入https://www.myApache.com:8888/,就可以發現https部署成功,可以看到我們漂亮的鎖頭。太棒了!你成功了!
這是chrome:

這是IE:
1.4 在https單向的基礎上,完成的Https雙向的配置。就是用戶端也必須有一個證書,提供給服務端校驗,效果:
部署https雙向認證後,當你再次通路https://www.myApache.com:8888時,會提示你沒有用戶端證書。
你必須在浏覽器安裝一個用戶端證書,選擇證書後,才能通路。
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.pk12:
> 輸入PK12檔案的密碼,之後一直點next,然後儲存。
1.4.4 驗收成果,重新開機Apache,關閉所有浏覽器,重新輸入https://www.myApache.com:8888 .你可以看到會彈出一個 用戶端證書的選擇,
選擇證書後點選确定,就可以通路到了!
恭喜!使用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
//加油吧,渣科。