1. 程式人生 > >apache伺服器中openssl配置https

apache伺服器中openssl配置https

最近需要研究下apache的簽名問題,主要是利用openssl來實現,就對openssl研究了下。

理論基礎:

OpenSSL初接觸的人恐怕最難的在於先理解各種概念  公鑰/私鑰/簽名/驗證簽名/加密/解密/非對稱加密  我們一般的加密是用一個密碼加密檔案,然後解密也用同樣的密碼.這很好理解,這個是對稱加密.而有些加密時,加密用的一個密碼,而解密用另外一組密碼,這個叫非對稱加密,意思就是加密解密的密碼不一樣.初次接觸的人恐怕無論如何都理解不了.其實這是數學上的一個素數積求因子的原理的應用,如果你一定要搞懂,百度有大把大把的資料可以看,其結果就是用這一組金鑰中的一個來加密資料,可以用另一個解開.是的沒錯,公鑰和私鑰都可以用來加密資料,相反用另一個解開,公鑰加密資料,然後私鑰解密的情況被稱為加密解密,私鑰加密資料,公鑰解密一般被稱為簽名和驗證簽名.
  因為公鑰加密的資料只有它相對應的私鑰可以解開,所以你可以把公鑰給人和人,讓他加密他想要傳送給你的資料,這個資料只有到了有私鑰的你這裡,才可以解開成有用的資料,其他人就是得到了,也看懂內容.同理,如果你用你的私鑰對資料進行簽名,那這個資料就只有配對的公鑰可以解開,有這個私鑰的只有你,所以如果配對的公鑰解開了資料,就說明這資料是你發的,相反,則不是.這個被稱為簽名.  實際應用中,一般都是和對方交換公鑰,然後你要發給對方的資料,用他的公鑰加密,他得到後用他的私鑰解密,他要發給你的資料,用你的公鑰加密,你得到後用你的私鑰解密,這樣最大程度保證了安全性.  RSA/DSA/SHA/MD5  非對稱加密的演算法有很多,比較著名的有RSA/DSA ,不同的是RSA可以用於加/解密,也可以用於簽名驗籤,DSA則只能用於簽名.至於SHA則是一種和md5相同的演算法,它不是用於加密解密或者簽名的,它被稱為摘要演算法.就是通過一種演算法,依據資料內容生成一種固定長度的摘要,這串摘要值與原資料存在對應關係,就是原資料會生成這個摘要,但是,這個摘要是不能還原成原資料的,嗯....,正常情況下是這樣的,這個演算法起的作用就是,如果你把原資料修改一點點,那麼生成的摘要都會不同,傳輸過程中把原資料給你再給你一個摘要,你把得到的原資料同樣做一次摘要演算法,與給你的摘要相比較就可以知道這個資料有沒有在傳輸過程中被修改了.
  實際應用過程中,因為需要加密的資料可能會很大,進行加密費時費力,所以一般都會把原資料先進行摘要,然後對這個摘要值進行加密,將原資料的明文和加密後的摘要值一起傳給你.這樣你解開加密後的摘要值,再和你得到的資料進行的摘要值對應一下就可以知道資料有沒有被修改了,而且,因為私鑰只有你有,只有你能解密摘要值,所以別人就算把原資料做了修改,然後生成一個假的摘要給你也是不行的,你這邊用金鑰也根本解不開.   CA/PEM/DER/X509/PKCS  一般的公鑰不會用明文傳輸給別人的,正常情況下都會生成一個檔案,這個檔案就是公鑰檔案,然後這個檔案可以交給其他人用於加密,但是傳輸過程中如果有人惡意破壞,將你的公鑰換成了他的公鑰,然後得到公鑰的一方加密資料,他就可以用他自己的金鑰解密看到資料了.為了解決這個問題,需要一個公證方來做這個事,任何人都可以找它來確認公鑰是誰發的.這就是CA,CA確認公鑰的原理也很簡單,它將它自己的公鑰釋出給所有人,然後一個想要釋出自己公鑰的人可以將自己的公鑰和一些身份資訊發給CA,CA用自己的金鑰進行加密,這裡也可以稱為簽名.然後這個包含了你的公鑰和你的資訊的檔案就可以稱為證書檔案了.這樣一來所有得到一些公鑰檔案的人,通過CA的公鑰解密了檔案,如果正常解密那麼機密后里面的資訊一定是真的,因為加密方只可能是CA,其他人沒它的金鑰啊.這樣你解開公鑰檔案,看看裡面的資訊就知道這個是不是那個你需要用來加密的公鑰了.
  實際應用中,一般人都不會找CA去簽名,因為那是收錢的,所以可以自己做一個自簽名的證書檔案,就是自己生成一對金鑰,然後再用自己生成的另外一對金鑰對這對金鑰進行簽名,這個只用於真正需要簽名證書的人,普通的加密解密資料,直接用公鑰和私鑰來做就可以了.  金鑰檔案的格式用OpenSSL生成的就只有PEM和DER兩種格式,PEM的是將金鑰用base64編碼表示出來的,直接開啟你能看到一串的英文字母,DER格式是二進位制的金鑰檔案,直接開啟,你可以看到........你什麼也看不懂!.X509是通用的證書檔案格式定義.pkcs的一系列標準是指定的存放金鑰的檔案標準,你只要知道PEM DER X509 PKCS這幾種格式是可以互相轉化的.

關於證書1、每個人都可以使用一些證書生成工具為自己的https站點生成證書(比如jdk的keytool),大家稱它為“自簽名證書”,但是自己生成的證書是不被網際網路承認的,所以瀏覽器會報安全提示,要求你手動安裝證書。只有通過權威的CA機構付費獲得的證書才能被網際網路承認(有點類似於根域伺服器的權威機構)。2、證書(無客戶端服務端之分)儲存著ip資訊、證書過期時間、證書所有者地址資訊等。雙向認證  1、先決條件是有兩個或兩個以上的證書,一個是服務端證書,另一個或多個是客戶端證書。  2、服務端儲存著客戶端的證書並信任該證書,客戶端儲存著服務端的證書並信任該證書。這樣,在證書驗證成功的情況下即可完成請求響應。  3、雙向認證一般企業應用對接。單向認證  1、客戶端儲存著服務端的證書並信任該證書即可  2、https一般是單向認證,這樣可以讓絕大部分人都可以訪問你的站點。下面瞭解下證書一般需要三個,CA證書,伺服器證書,客戶端證書。

實現方法:

(1) 建立CA證書: # basedir="/data/webapps/apache/ca" # openssl genrsa -out private/ca.key 2048 # openssl req -new -key private/ca.key -out private/ca.csr # openssl x509 -req -days 365 -in private/ca.csr -signkey private/ca.key -out private/ca.crt # echo FACE > serial # touch index.txt # openssl ca -out ${basedir}/private/ca.crt -crldays 365 -config "${basedir}/conf/openssl.conf"(2) 建立伺服器證書 # openssl genrsa -out server/server.key 2048 # openssl req -new -key server/server.key -out server/server.csr # openssl ca -in server/server.csr -cert private/ca.crt -keyfile private/ca.key -out server/server.crt -config "${basedir}/conf/openssl.conf"(3) 建立client證書 # mkdir -p $base/users/ # openssl genrsa -des3 -out $base/users/client.key 1024 # openssl req -new -key $base/users/client.key -out $base/users/client.csr # openssl ca -in $base/users/client.csr -cert $base/private/ca.crt -keyfile $base/private/ca.key -out $base/users/client.crt -config "${base}/conf/openssl.conf" # openssl pkcs12 -export -clcerts -in $base/users/client.crt -inkey $base/users/client.key -out $base/users/client.p12過程中還會需要輸入一些註冊資訊。

在執行之前需要注意openssl.conf的配置檔案,如下:

[ ca ]  
default_ca      = foo                                      # The default ca section  

[ foo ]  
dir            = /data/webapps/apache/ca                   # top dir  
database       = /data/webapps/apache/ca/index.txt         # index file.  
new_certs_dir  = /data/webapps/apache/ca/newcerts          # new certs dir  

certificate    = /data/webapps/apache/ca/private/ca.crt    # The CA cert  
serial         = /data/webapps/apache/ca/serial            # serial no file  
private_key    = /data/webapps/apache/ca/private/ca.key    # CA private key  
RANDFILE       =/data/webapps/apache/ca/private/.rand      # random number file

default_days   = 365                                       # how long to certify for  
default_crl_days= 30                                       # how long before next CRL  
default_md     = md5                                       # message digest method to use  
unique_subject = no                                        # Set to 'no' to allow creation of  
                                                           # several ctificates with same subject.  
policy         = policy_any                                # default policy      
[ policy_any ]  
countryName = match  
stateOrProvinceName = match  
organizationName = match  
organizationalUnitName = match  
localityName            = optional  
commonName              = supplied  
emailAddress            = optional
(4) 最後需要修改下apache的配置檔案https-ssl.confSSLEngine on
SSLCertificateFile "/data/webapps/apache/ca/server/server.crt"
SSLCertificateKeyFile "/data/webapps/apache/ca/server/server.key"SSLCACertificateFile "/data/webapps/apache/ca/private/ca.crt"SSLVerifyClient require SSLVerifyDepth 10.

參考:

https://blog.csdn.net/qsj123one/article/details/53151412

https://blog.csdn.net/oldmtn/article/details/52208747