https證書互信解決方案—創建私有CA並申請證書

前言

https相較於http而言有很大的安全性,當我們一個服務開啓https並與之通信時,往往需要證書的認證,如果是瀏覽器訪問服務,只要在瀏覽器內設置信任證書即可,而如果是程序內訪問服務(如java程序),則需要導入該服務的證書所信任的證書。

實際情況中,內部系統的互相通信使用https,往往不可能向公有CA申請證書(申請證書需要很高的費用),故我們需要創建一個私有CA來申請證書實現https通信。

名詞介紹

CA和證書認證

詳見我的一篇博文:https簡單解讀

實現步驟

環境介紹

  1. 64位 centos 7.X操作系統
  2. 裝有openssl命令

構建私有CA

CA要給別人簽發證書,首先自己得有一個作爲根證書,我們得在一切工作之前修改好CA的配置文件、序列號、索引等等。

輸入以下命令更改配置文件:

vi /etc/pki/tls/openssl.cnf

配置文件更改以下部分:

[ CA_default ]
 
dir             = /etc/pki/CA           # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.
 
certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem # The private key
RANDFILE        = $dir/private/.rand    # private random number file
...
default_days    = 3650                  # how long to certify for
...
# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

在/etc/pki/CA目錄創建兩個文件index.txt和serial:

cd /etc/pki/CA && touch index.txt serial && echo 01 > serial

仍在當前目錄下生成一個CA私鑰cakey.pem和自簽證書cacert.pem:

openssl genrsa -out private/cakey.pem 2048
openssl req -new -x509 -key private/cakey.pem -out cacert.pem

生成公鑰的時候會提示輸入一些信息,例子如下:

Country Name (2 letter code) []:CN                                 #國家名
State or Province Name (full name) []:hangzhou                     #省份名
Locality Name (eg, city) []:hangzhou                               #地名
Organization Name (eg, company) []:company                         #公司名
Organizational Unit Name (eg, section) []:unit                     #部門名
Common Name (eg, your websites domain name) []:localhost           #服務域名
Email Address []:                                                  #電子郵件

後面一些信息可按回車略過

這裏比較重要的是Comman Name填寫的是服務的域名地址,即如果該證書用於某個服務則填該服務的域名地址(如用於百度服務器,則填寫www.baidu.com)

本方案的CA證書不用於某個服務,故可填localhost

私有CA簽署證書

爲一個服務生成私鑰server.key和一個證書請求文件server.csr:

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr

生成證書請求文件時,仍會提示輸入一些信息,例子如下:

Country Name (2 letter code) []:CN                                 #國家名
State or Province Name (full name) []:hangzhou                     #省份名
Locality Name (eg, city) []:hangzhou                               #地名
Organization Name (eg, company) []:company                         #公司名
Organizational Unit Name (eg, section) []:unit                     #部門名
Common Name (eg, your websites domain name) []:XXX.XXX.XXX         #服務域名
Email Address []:                                                  #電子郵件

這裏的Common Name就應該填你實際服務所用的域名了

下面將該證書請求文件server.csr由你構建的私有CA簽署,生成一個server.crt證書:

openssl x509 -req -in server.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out server.crt

到此爲止,server.crt證書可用於服務提供https訪問,客戶端若想訪問該服務,導入CA根證書cacert.pem即可。

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