日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

httpd设置HTTPS双向认证

發(fā)布時間:2023/11/29 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 httpd设置HTTPS双向认证 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

去年用tomcat、jboss配置過HTTPS雙向認證,那時候主要用的是JDK自帶的keytool工具。這次是用httpd + openssl,區(qū)別比較大

在網(wǎng)上搜索了很多文章,發(fā)現(xiàn)全面介紹的不多,或者就是版本比較舊了。所以把我配置的過程完整地記錄下來,以供參考

首先要說明一下,HTTPS涉及到的內(nèi)容非常繁雜,包括各種術(shù)語、命令、算法,我現(xiàn)在也沒有完全搞清楚。本文會盡量把我知道的解釋一下,但是深入的內(nèi)容,暫時不打算深究了

一、環(huán)境

httpd: 2.4.4
openssl:1.0.1
os:ubuntu 12.04 LTS

二、場景

我準備在httpd上配置一個HTTPS雙向認證,既向客戶端表明自己的身份,也只允許特定的客戶端訪問。本文說的主要是作為server的角色的配置,至于作為client的配置,最后也會稍微介紹一下,但是不會詳細說明

一般來說,互聯(lián)網(wǎng)站不會去配置雙向認證,因為客戶端證書的分發(fā)和管理會比較麻煩,會把用戶擋在門外,所以一般是不能這么做的。當然,像銀行等對安全要求很高的網(wǎng)站,也會采用雙向認證,比如U盾、安全控件什么的,其實就是固化的客戶端證書

但是對于企業(yè)應(yīng)用來說,客戶一般是固定的,比如兩個已知的系統(tǒng)對接、內(nèi)部系統(tǒng)集成等。所以在企業(yè)應(yīng)用領(lǐng)域,雙向認證還是比較常見的

三、背景知識

證書(Certificate)是HTTPS的核心,但是其實證書并不是一個單一的東西,而是幾種技術(shù)的綜合

為了網(wǎng)絡(luò)傳輸?shù)陌踩?#xff0c;有很多種技術(shù),最主要的是以下3種:

1、加密/解密

避免消息明文傳輸,對消息進行加密。早期一般是用對稱加密算法,現(xiàn)在一般都是不對稱加密,最常見的算法就是RSA。在后面的介紹中,也會多次看到RSA這個詞

2、消息摘要

這個技術(shù)主要是為了避免消息被篡改。消息摘要是把一段信息,通過某種算法,得出一串字符串。這個字符串就是消息的摘要。如果消息被篡改(發(fā)生了變化),那么摘要也一定會發(fā)生變化(一般是這樣的。如果2個不同的消息生成的摘要是一樣的,那么這就叫發(fā)生了碰撞)

消息摘要的算法主要有MD5和SHA,在證書領(lǐng)域,一般都是用SHA(安全哈希算法)

3、數(shù)字簽名

數(shù)字簽名是為了驗證雙方的身份,避免身份偽造

以上三個技術(shù)結(jié)合起來,就是在HTTPS中廣泛應(yīng)用的證書(certificate),證書本身攜帶了加密/解密的信息,并且可以標識自己的身份,也自帶消息摘要

四、在httpd中配置單向HTTPS

首先在%HTTPD_HOME%/conf/目錄下,修改httpd.conf文件,加載必要的模塊

Httpd代碼 ?
  • LoadModule?socache_shmcb_module?modules/mod_socache_shmcb.so??
  • LoadModule?socache_dbm_module?modules/mod_socache_dbm.so??
  • LoadModule?socache_memcache_module?modules/mod_socache_memcache.so??
  • LoadModule?ssl_module?modules/mod_ssl.so??

  • 這里的前提是,在編譯httpd的時候,已經(jīng)編譯了ssl模塊。這個步驟看另一篇文檔:
    http://kyfxbl.iteye.com/blog/1902299

    然后再導入默認的SSL配置文件,當然也可以選擇不導入,在httpd.conf直接配置。但是導入默認的可以節(jié)省很多時間,并且默認的文件是用vhost配置的,不會跟main server沖突,可以算是一種最佳實踐

    Httpd代碼 ?
  • #?Secure?(SSL/TLS)?connections??
  • Include?conf/extra/httpd-ssl.conf??
  • ??
  • <IfModule?ssl_module>??
  • SSLRandomSeed?startup?builtin??
  • SSLRandomSeed?connect?builtin??
  • </IfModule>??

  • 然后打開%HTTPD_HOME%/conf/extra/目錄,看一下httpd-ssl.conf,主要有以下幾個配置

    Httpd代碼 ?
  • SSLEngine?on??
  • SSLCertificateFile?"/usr/local/httpd/conf/server.cer"??
  • SSLCertificateKeyFile?"/usr/local/httpd/conf/server.key.pem"??
  • #SSLCACertificateFile?"/usr/local/httpd/conf/ca.cer"??
  • #SSLVerifyClient?require??
  • #SSLVerifyDepth??10??

  • 只要開啟前3個,單向的HTTPS認證就配置好了。后面3個目前先注釋掉,是后面雙向認證才用到

    然后重啟一下httpd,會發(fā)現(xiàn)報錯:

    AH00526: Syntax error on line 106 of /usr/local/httpd/conf/extra/httpd-ssl.conf:
    SSLCertificateFile: file '/usr/local/httpd/conf/server.cer' does not exist or is empty

    這是因為httpd需要一個服務(wù)端的私鑰(.key.pem),和一個服務(wù)端證書(.cer)。前面已經(jīng)配置了這2個文件的路徑,但是還沒有創(chuàng)建。下一步就要創(chuàng)建這些文件

    五、創(chuàng)建CA(Certificate Authority)

    這個CA,也叫“根證書”

    服務(wù)端做了一個證書,但是這是沒有法律效力的,誰都可以自己做證書,就根本達不到安全的目的。所以就要有一個機構(gòu),負責來確認服務(wù)端的身份,然后統(tǒng)一的簽發(fā)證書。這樣才能有權(quán)威性

    當瀏覽器通過HTTPS協(xié)議訪問一個網(wǎng)站,網(wǎng)站首先會發(fā)過來一個自己的證書(certificate)。接下來瀏覽器就會到權(quán)威機構(gòu)(CA),去 驗證一下這個證書是不是它簽發(fā)的。如果是的話,就信任這個網(wǎng)站的證書,繼續(xù)訪問;如果不是的話,要怎么處理就依賴于實現(xiàn)了。一般的瀏覽器會彈出一個警告, 讓用戶自己決定要不要繼續(xù)訪問。當然直接拒絕也是可以的

    現(xiàn)在國際上有3大CA機構(gòu),如果是要自己做一個網(wǎng)站的話,如上所述,一般是需要請這些權(quán)威機構(gòu)幫忙簽發(fā)證書的。現(xiàn)在所有的主流瀏覽器,默認都安裝 了這些CA的根證書,所以如果網(wǎng)站的證書是這些權(quán)威機構(gòu)簽發(fā)的,瀏覽器就不會發(fā)出警告了。比如支付寶,它的證書是由VeriSign簽發(fā)的,所以訪問支付 寶,瀏覽器不會發(fā)出警告



    這里還有一個鏈條的關(guān)系,比如我有10個子網(wǎng)站,如果每個都要去找CA簽發(fā)證書,就很麻煩。我可以找CA給我簽發(fā)一個次級根證書,然后再用這個次 級根證書給自己簽發(fā)10個證書。那么只要客戶的瀏覽器里有CA根證書就可以了,這10個證書都可以通過認證,不要求客戶安裝次級根證書,原文見下:

    引用 Intermediate CA certificates lie between the root CA certificate (which is installed in the browsers) and the server certificate (which you installed on the server).



    如果是企業(yè)應(yīng)用,那完全可以自己給自己當CA,因為可以要求目標用戶(系統(tǒng))安裝自己的CA根證書,效果是一樣的,還可以省下請權(quán)威CA簽發(fā)證書的費用(互聯(lián)網(wǎng)應(yīng)用分發(fā)自己的CA到無數(shù)的互聯(lián)網(wǎng)用戶上,難度很大)

    下面就介紹如何創(chuàng)建自己的CA

    1、準備工作

    先在隨便一個目錄,創(chuàng)建以下幾個子目錄:
    /private
    /certificates

    其中private放的是私鑰和CSR(后面會介紹),certificates里放的就是證書了

    2、創(chuàng)建CA私鑰

    Openssl代碼 ?
  • openssl?genrsa?-aes256?-out?private/ca.key.pem?2048??

  • 最后的參數(shù)是RSA密鑰的長度,默認是512。2048其實長了一點,老的瀏覽器稍后會不支持,不過現(xiàn)在的主流瀏覽器都是支持的,所以問題不大

    通過這個命令,私鑰就創(chuàng)建好了,文件名是ca.key.pem

    用這個命令,可以看一下剛才創(chuàng)建的這個私鑰的信息

    Openssl代碼 ?
  • openssl?rsa?-noout?-text?-in?private/ca.key.pem??

  • 不過基本上,看也是白看,反正我是看不懂。只知道私鑰里其實有2組數(shù)字,是用來形成公鑰的,最后也會包含在證書里

    引用
    A private key contains a series of numbers. Two of these numbers form the "public key", the others are part of the "private key". The "public key" bits are included when you generate a CSR, and subsequently form part of the associated Certificate.



    另外,最后的.pem擴展名,是表示該私鑰用PEM編碼。實際上私鑰和證書都是用PEM編碼的,PEM只是一種編碼格式,不需要太在意。 httpd可以直接處理這種編碼格式,但是瀏覽器和JAVA都不行,所以在需要的時候,會把編碼從PEM改成PKCS,后面會介紹。只要知道證書和私鑰都 有編碼,只是編碼是PEM還是PKCS的區(qū)別而已。就像"你好"可以用UTF-8編碼,也可以用GBK編碼一樣,內(nèi)容是不變的

    3、創(chuàng)建CA簽名請求

    Openssl代碼 ?
  • openssl?req?-new?-key?private/ca.key.pem?-out?private/ca.csr?-subj?"/C=CN/ST=SZ/L=SZ/O=kyfxbl/OU=kyfxbl/CN=*.kyfxbl.net"??

  • 這里要注意的是,如果不用-subj參數(shù),那么就會在命令行交互輸入簽發(fā)目標的身份識別信息,這叫DN(Distinguished Name)。其中別的都不要緊,最重要的是CN那一行,因為我這里是根證書,所以我設(shè)置為*.kyfxbl.net,這樣我后面用這個CA簽發(fā)的 www.kyfxbl.net、game.kyfxbl.net、news.kyfxbl.net……,全都是有效的

    生成的簽名請求文件,是ca.csr

    Openssl代碼 ?
  • openssl?req?-noout?-text?-in?private/ca.csr??

  • 同上,看不懂

    4、自己簽發(fā)CA根證書

    Openssl代碼 ?
  • openssl?x509?-req?-days?3650?-sha1?-extensions?v3_ca?-signkey?private/ca.key.pem?-in?private/ca.csr?-out?certificates/ca.cer??

  • 這里參數(shù)很復雜,我也不太清楚準確的意思是什么,可以用openssl x509 -help自己研究一下

    生成的ca.cer,就是最終的根證書了!這個文件非常重要,因為后續(xù)的服務(wù)端證書、客戶端證書,都是用這個CA簽發(fā)的,也要把它分發(fā)給客戶,讓他們導入到自己的瀏覽器或者系統(tǒng)中

    查看的命令是:

    Openssl代碼 ?
  • openssl?x509?-noout?-text?-in?certificates/ca.cer??


  • 5、把根證書從PEM編碼轉(zhuǎn)為PKCS編碼

    這步其實不是必選的,但是前面說過,JAVA環(huán)境是不能直接用PEM編碼的證書的,很多瀏覽器也不行,所以有時候也需要轉(zhuǎn)一下編碼

    Openssl代碼 ?
  • openssl?pkcs12?-export?-cacerts?-inkey?private/ca.key.pem?-in?certificates/ca.cer?-out?certificates/ca.p12??

  • 得到的ca.p12就是轉(zhuǎn)碼后的CA根證書,在不能直接用ca.cer的時候,就用ca.p12代替

    六、簽發(fā)服務(wù)端證書

    現(xiàn)在CA根證書和私鑰都有了,就可以開始簽發(fā)服務(wù)端證書了(簽發(fā)請求ca.csr是過程文件,有了cer就不再需要它了,要刪掉也可以)。下面的命令和簽發(fā)CA證書時都差不多,但是參數(shù)上有區(qū)別

    1、創(chuàng)建服務(wù)端私鑰

    Openssl代碼 ?
  • openssl?genrsa?-aes256?-out?private/server.key.pem?2048??

  • 2、創(chuàng)建服務(wù)端證書簽發(fā)請求

    Openssl代碼 ?
  • openssl?req?-new?-key?private/server.key.pem?-out?private/server.csr?-subj?"/C=CN/ST=SZ/L=SZ/O=kyfxbl/OU=kyfxbl/CN=www.kyfxbl.net"??

  • 和ca.csr的區(qū)別在于,這里的CN不是*.kyfxbl.net,而是www.kyfxbl.net,因為我現(xiàn)在是在為www.kyfxbl.net申請證書

    3、利用CA根證書,簽發(fā)服務(wù)端證書

    Openssl代碼 ?
  • openssl?x509?-req?-days?3650?-sha1?-extensions?v3_req?-CA?certificates/ca.cer?-CAkey?private/ca.key.pem?-CAserial?ca.srl?-CAcreateserial?-in?private/server.csr?-out?certificates/server.cer??

  • 這里和前面自己簽發(fā)CA證書時,參數(shù)區(qū)別就比較大了,最后得到的server.cer,就是服務(wù)端證書

    七、測試單向認證

    把server.key.pem和server.cer拷貝到%HTTPD_HOME%/conf/目錄下,然后重新啟動httpd,會要求輸入一個密碼



    然后訪問http://localhost:443/,會報400錯誤:



    接下來用https://localhost:443來訪問,瀏覽器報警:



    這里就是前面創(chuàng)建CSR時,輸入的CN的作用,這個證書是為www.kyfxbl.net申請的,這里請求的地址卻是localhost,不匹配所以報錯。為了能用www.kyfxbl.net這個主機名來訪問,就需要改一下/etc/hosts文件:

    127.0.0.1?????? localhost
    192.168.1.102?? www.kyfxbl.net

    然后就可以用www.kyfxbl.net來訪問了,再試一下:https://www.kyfxbl.net/

    這次瀏覽器還是告警,但是告警信息變了:



    證書信息如下:



    可以看到這個證書是由*.kyfxbl.net這個CA頒發(fā)的,瀏覽器不認識,所以不信任由這個CA簽發(fā)的所有證書。接下來就需要把ca.cer 導入瀏覽器。這里直接導入server.cer也是可以的,但是后面如果又創(chuàng)建一個網(wǎng)站比如說www2.kyfxbl.net,那么又不行了。所以最好的 辦法是直接導入CA根證書,那么后續(xù)只要是用這個根證書簽發(fā)的證書,瀏覽器都會信任

    導入前:



    導入后:



    再次訪問,可以看到成功了,瀏覽器不告警,并且URL欄前面打了一個綠勾



    八、配置雙向認證

    如果要配置服務(wù)器只允許合法的用戶訪問,就需要配置雙向認證

    配置為雙向認證之后,除了服務(wù)端要發(fā)證書給客戶端之外,客戶端也要發(fā)客戶端證書到服務(wù)端,服務(wù)端認證通過,才允許訪問

    Httpd代碼 ?
  • SSLCACertificateFile?"/usr/local/httpd/conf/ca.cer"??
  • SSLVerifyClient?require??
  • SSLVerifyDepth??10??

  • 在單項認證的基礎(chǔ)上,再配置以上3個參數(shù)

    SSLCACertificateFile,這個意思是當客戶端發(fā)來客戶端證書的時候,httpd用哪個CA根證書校驗它

    配置好了,還不能重啟,因為現(xiàn)在客戶端證書還沒做好

    這里要說明一下,客戶端證書是怎么來的

    有2種方式:

    第一種,客戶端也自己CA,然后簽發(fā)證書給自己。把客戶端的CA根證書發(fā)過來,配置成SSLCACertificateFile。這在互聯(lián)網(wǎng)應(yīng)用里基本是不可能的,安全和管理都是問題。但是在企業(yè)應(yīng)用里,還是比較常見的,雙方互相交換CA根證書

    第二種,就用剛才服務(wù)端的CA根證書,簽發(fā)一個客戶端證書,發(fā)給用戶,用戶每次用這個證書來發(fā)請求,像銀行,支付寶等等,用的是這種方式

    當然理論上其實還有一種辦法,就是客戶自己去找權(quán)威CA簽證書,但是這個是不可能的,因為很麻煩,找CA簽也非常貴

    本文用的是第2種方法。其實都是一樣的。關(guān)鍵還是在CA根證書上,所以前面也說過了,CA根證書非常重要

    九、簽發(fā)客戶端證書

    1、創(chuàng)建客戶端私鑰

    Openssl代碼 ?
  • openssl?genrsa?-aes256?-out?private/client.key.pem?2048??

  • 2、創(chuàng)建客戶端證書簽發(fā)請求

    Openssl代碼 ?
  • openssl?req?-new?-key?private/client.key.pem?-out?private/client.csr?-subj?"/C=CN/ST=SZ/L=SZ/O=kyfxbl/OU=kyfxbl/CN=kyfxbl"??

  • 這里的不同在于,這里的CN不是*.kyfxbl.net,也不是www.kyfxbl.net,隨便填一個kyfxbl就好了,或者干脆叫user都沒問題,反正是一個客戶端證書

    3、利用CA根證書,簽發(fā)客戶端證書

    Openssl代碼 ?
  • openssl?x509?-req?-days?3650?-sha1?-extensions?v3_req?-CA?certificates/ca.cer?-CAkey?private/ca.key.pem?-CAserial?ca.srl?-CAcreateserial?-in?private/client.csr?-out?certificates/client.cer??

  • 這里和簽發(fā)server.cer基本是一樣的

    4、把客戶端證書轉(zhuǎn)換成p12格式

    Openssl代碼 ?
  • openssl?pkcs12?-export?-clcerts?-inkey?private/client.key.pem?-in?certificates/client.cer?-out?certificates/client.p12??

  • 這步是必須的,因為稍后就需要把客戶端證書導入到瀏覽器里,但是一般瀏覽器都不能直接使用PEM編碼的證書

    十、測試雙向認證

    把ca.cer拷貝到%HTTPD_HOME%/conf/目錄下,重啟httpd

    然后再次訪問https://www.kyfxbl.net/,結(jié)果這次不是警告,而是直接報錯:



    接下來要把client.p12導入到瀏覽器里

    導入前:



    導入的時候會要求輸入密碼,這是為了避免有人偷偷拷貝了別人的客戶端證書,偽裝成合法用戶:



    導入后:



    然后再次訪問,瀏覽器會要求選擇證書。這個步驟是通過雙向認證訪問網(wǎng)站時必須的,但是平時訪問銀行、支付寶的時候貌似沒有,這是因為這些網(wǎng)站為了簡化用戶的操作,都會要求用戶安裝什么“安全控件”,控件自動選擇了證書



    點擊確定,訪問成功!

    十一、JKS等

    到這里,用httpd配置雙向HTTPS認證就完成了

    本文說的是作為server的角色,要如何配置。但是在JAVA環(huán)境下,如果要以client的角色,通過雙向認證發(fā)起請求,則還有些不同

    這里實際上是要充當一個類似瀏覽器的角色,需要校驗server certificate,還需要在發(fā)起請求的時候,把client certificate發(fā)過去

    在JAVA里,是通過keystore和truststore來實現(xiàn)的,不在本文的討論范圍內(nèi)。可以看一下其他的幾篇博客,在HTTPS分類里

    十二、參考資料

    http://httpd.apache.org/docs/2.4/en/ssl/
    http://linux.chinaunix.net/techdoc/net/2008/01/08/976172.shtml
    《JAVA加密與解密的藝術(shù)》——作者梁棟

    轉(zhuǎn)載于:https://www.cnblogs.com/kabi/p/5623198.html

    總結(jié)

    以上是生活随笔為你收集整理的httpd设置HTTPS双向认证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。