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.conf
SSLEngine 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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章