openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
1.采用自定義配置文件的實現方法
1.1 自建CA
自建CA的機制:1.生成私鑰;2.創建證書請求;3.使用私鑰對證書請求簽名。
由於測試環境,所以自建的CA只能是根CA。所使用的配置文件如下。
[default] name = root-ca /* 變量*/ default_ca = CA_default name_opt = ca_default cert_opt = ca_default [CA_default] home = . /* 變量*/ database = $home/db/index serial = $home/db/serial crlnumber = $home/db/crlnumber certificate = $home/$name.crt private_key = $home/private/$name.key RANDFILE = $home/private/random new_certs_dir = $home/certs unique_subject = no copy_extensions = none default_days = 3650 default_crl_days = 365 default_md = sha256 policy = policy_to_match [policy_to_match] countryName = match stateOrProvinceName = optional organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [CA_DN] countryName = "C" contryName_default = "CN" organizationName = "O" organizationName_default = "jmu" commonName = "CN" commonName_default = "longshuai.com" [req] default_bits = 4096 encrypt_key = no default_md = sha256 utf8 = yes string_mask = utf8only # prompt = no /* 測試時該選項導致出錯,所以將其注釋掉*/ distinguished_name = CA_DN req_extensions = ca_ext [ca_ext] basicConstraints = critical,CA:true keyUsage = critical,keyCertSign,cRLSign subjectKeyIdentifier = hash
(1).創建openssl的目錄結構
(a).創建配置文件
[root@xuexi ~]# mkdir /ssl;touch /ssl/ssl.conf [root@xuexi ~]# cd /ssl [root@xuexi ssl]# vim ssl.conf
(b).創建openssl的目錄結構中的目錄,在上述配置文件中的目錄分別為/ssl/db、/ssl/private和/ssl/certs,可以考慮將private目錄的權限設置為600或者400。
[root@xuexi ssl]# mkdir /ssl/{db,private,certs} [root@xuexi ssl]# chmod -R 400 private/
(2).CA自簽名
普通的證書請求需要使用CA的私鑰進行簽名變成證書,既然是自簽名證書那當然是使用自己的私鑰來簽名。可以使用偽命令req、ca、x509來自簽名。
使用req偽命令創建CA
這里有兩種方法:1.一步完成,即私鑰、證書請求、自簽名都在一個命令中完成2.分步完成,先生成私鑰、再創建證書請求、再指定私鑰來簽名。方法2中其實生成私鑰和證書申請可以合並在一步中完成,證書申請和簽名也可以合並在一步中完成。
方法一:一步完成
在下面的一步命令中,使用-new由於沒有指定私鑰輸出位置,所以自動保存在ssl.conf中default_keyfile指定的private.pem中;由於ssl.conf中的req段設置了encrypt_key=no,所以交互時不需要輸入私鑰的加密密碼;由於使用req -x509自簽名的證書有效期默認為30天,而配置文件中req段又不能配置該期限,所以只能使用-days來指定有效期限,注意這個-days選項只作用於x509簽名,證書請求中如果指定了時間是無效的。
[root@xuexi ssl]# openssl req -x509 -new -out req.crt -config ssl.conf -days 365 [root@xuexi ssl]# ll total 24 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 3272 Nov 22 10:52 private.pem /* 注意權限為644 */ -rw-r--r-- 1 root root 1753 Nov 22 10:52 req.crt -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf [root@xuexi ssl]# openssl x509 -noout -dates -in req.crt notBefore=Nov 22 02:52:24 2016 GMT notAfter=Nov 22 02:52:24 2017 GMT
方法二:分步完成,這里把各種可能的步驟合並都演示一遍
>>創建私鑰和證書請求合並而簽名獨自進行的方法<<
[root@xuexi ssl]# openssl req -newkey rsa:1024 -keyout key.pem -out req1.csr -config ssl.conf -days 365 [root@xuexi ssl]# openssl req -x509 -in req1.csr -key key.pem -out req1.crt [root@xuexi ssl]# openssl x509 -noout -dates -in req1.crt/* 注意簽名不要配置文件 */ notBefore=Nov 22 02:58:25 2016 GMT notAfter=Dec 22 02:58:25 2016 GMT /* 可以看到證書請求中指定-days是無效的 */ [root@xuexi ssl]# ll total 36 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db -rw-r--r-- 1 root root 912 Nov 22 10:57 key.pem drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 3272 Nov 22 10:52 private.pem -rw-r--r-- 1 root root 826 Nov 22 10:58 req1.crt -rw-r--r-- 1 root root 688 Nov 22 10:57 req1.csr -rw-r--r-- 1 root root 1753 Nov 22 10:52 req.crt -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf
>>獨自生成私鑰,而請求和簽名合並的方法<<
[root@xuexi ssl]# (umask 077;openssl genrsa -out key1.pem 1024) [root@xuexi ssl]# openssl req -x509 -new -key key1.pem -out req2.crt -config ssl.conf -days 365 [root@xuexi ssl]# openssl x509 -noout -dates -in req2.crt notBefore=Nov 22 03:28:31 2016 GMT notAfter=Nov 22 03:28:31 2017 GMT [root@xuexi ssl]# ll total 44 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db -rw-r--r-- 1 root root 912 Nov 22 10:57 key1.pem -rw------- 1 root root 887 Nov 22 11:26 key2.pem drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 3272 Nov 22 10:52 private.pem -rw-r--r-- 1 root root 826 Nov 22 10:58 req1.crt -rw-r--r-- 1 root root 688 Nov 22 10:57 req1.csr -rw-r--r-- 1 root root 709 Nov 22 11:28 req2.crt -rw-r--r-- 1 root root 1753 Nov 22 10:52 req.crt -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf
>>完全分步進行<<
[root@xuexi ssl]# rm -rf key* req* private.pem [root@xuexi ssl]# (umask 077;openssl genrsa -out key.pem 1024) [root@xuexi ssl]# openssl req -new -key key.pem -out req.csr -config ssl.conf [root@xuexi ssl]# openssl req -x509 -key key.pem -in req.csr -out req.crt -days 365 [root@xuexi ssl]# openssl x509 -noout -dates -in req.crt notBefore=Nov 22 04:29:21 2016 GMT notAfter=Nov 22 04:29:21 2017 GMT [root@xuexi ssl]# ll total 28 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db -rw------- 1 root root 887 Nov 22 12:28 key.pem drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 826 Nov 22 12:29 req.crt -rw-r--r-- 1 root root 688 Nov 22 12:28 req.csr -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf
在本節的開頭說明了創建證書請求時需要提供私鑰,這個私鑰的作用是為了提供公鑰。下面是驗證。
/* 提取私鑰key.pem中的公鑰到key.pub文件中 */ [root@xuexi ssl]# openssl rsa -in key.pem -pubout -out key.pub /* 輸出證書請求req.csr中的公鑰部分 */ [root@xuexi ssl]# openssl req -noout -pubkey -in req.csr -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+YBneLYbh+OZWpiyPqIQHOsU5 D8il6UF7hi3NgEX/6vtciSmp7GXpXUV1tDglCCTPOfCHcEzeO0Gvky21LUenDsl/ aC2lraSijpl41+rT4mKNrCyDPZw4iG44+vLHfgHb3wJhBbBk0aw51dmxUat8FHCL hU7nx+Du637UDlwdEQIDAQAB -----END PUBLIC KEY----- /* 查看key.pub,可以發現和req.csr中的公鑰是一樣的 */ [root@xuexi ssl]# cat key.pub -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+YBneLYbh+OZWpiyPqIQHOsU5 D8il6UF7hi3NgEX/6vtciSmp7GXpXUV1tDglCCTPOfCHcEzeO0Gvky21LUenDsl/ aC2lraSijpl41+rT4mKNrCyDPZw4iG44+vLHfgHb3wJhBbBk0aw51dmxUat8FHCL hU7nx+Du637UDlwdEQIDAQAB -----END PUBLIC KEY-----
雖然創建證書請求時使用的是公鑰,但是卻不能使用-key選項指定公鑰,而是只能指定私鑰,因為req -new或-newkey選項會調用openssl rsa命令來提取公鑰,指定公鑰該調用將執行失敗。
使用x509偽命令創建CA
使用x509偽命令需要提供請求文件,因此需要先創建證書請求文件。由於x509偽命令簽名時不讀取配置文件,所以不需要設置配置文件,若需要某選項,只需使用x509中對應的選項來達成即可。
以下x509 -req用於自簽名,需要-signkey提供簽名所需私鑰key.pem。
[root@xuexi ssl]# openssl req -new -keyout key.pem -out req.csr -config ssl.conf [root@xuexi ssl]# openssl x509 -req -in req.csr -signkey key.pem -out x509.crt
使用ca偽命令創建CA
使用ca偽命令自簽名會讀取配置文件中的ca部分,所以配置文件中所需的目錄和文件結構都需要創建好,包括目錄db、private、certs,文件db/index、db/serial,並向serial中寫入一個序列號。由於是自簽名,可以自行指定私鑰文件,因此對於簽名所需CA私鑰文件無需放置在private目錄中。
[root@xuexi ssl]# touch db/{serial,index} [root@xuexi ssl]# echo "01" > db/serial [root@xuexi ssl]# openssl req -new -keyout key.pem -out req.csr -config ssl.conf [root@xuexi ssl]# openssl ca -selfsign -keyfile key.pem -in req.csr -config ssl.conf
在此簽名過程中有兩次詢問,如下:
Certificate is to be certified until Nov 20 06:34:41 2026 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
若要無交互,則使用-batch進入批處理模式。
[root@xuexi ssl]# openssl ca -selfsign -keyfile key.pem -in req.csr -config ssl.conf -batch
1.2 為其他證書請求簽名
CA為其他請求或證書簽名時,需要使用到的文件有:自己的CA證書和自己的私鑰文件。因此簽名過程中需要提供這兩個文件。
(1).使用ca偽命令為其他證書請求簽名
使用ca偽命令自建根CA后,目錄結構如下:
[root@xuexi ssl]# tree -R -C . ├── certs │ └── 01.pem ├── db │ ├── index │ ├── index.attr │ ├── index.old │ ├── serial │ └── serial.old ├── key.pem ├── private ├── req.csr └── ssl.conf
其中01.pem是根CA證書,key.pem是根CA私鑰。
現在要為其他證書請求簽名,首先創建其他請求吧,假設該請求文件/tmp/req.csr。
[root@xuexi ssl]# openssl req -new -keyout /tmp/key.pem -out /tmp/req.csr -config ssl.conf
使用根證書01.pem為/tmp/req.csr簽名。
[root@xuexi ssl]# openssl ca -in /tmp/req.csr -keyfile key.pem -cert certs/01.pem -config ssl.conf -batch
這樣挺麻煩,因為每次為別人簽名時都要指定-cert和-keyfile,可以將CA的證書和CA的私鑰移動到配置文件中指定的路徑下:
certificate = $home/$name.crt private_key = $home/private/$name.key |
[root@xuexi ssl]# mv certs/01.pem root-ca.crt [root@xuexi ssl]# mv key.pem private/root-ca.key
再使用ca簽名時將可以使用默認值。
[root@xuexi ssl]# openssl ca -in /tmp/req.csr -config ssl.conf -batch
(2).使用x509偽命令為其他證書請求簽名
現在根CA證書為root-ca.crt,CA的私鑰為private/root-ca.key。
下面使用x509偽命令實現簽名。由於x509不會讀取配置文件,所以需要提供簽名的序列號,使用-CAcreateserial可以在沒有序列號文件時自動創建;由於x509默認-in指定的輸入文件是證書文件,所以要對請求文件簽名,需要使用-req來表示輸入文件為請求文件。
[root@xuexi ssl]# openssl x509 -req -in /tmp/req.csr -CA root-ca.crt -CAkey private/root-ca.key -out x509.crt -CAcreateserial
2.采用默認配置文件/etc/pki/tls/openssl.cnf的實現方法
這是推薦采用的方法,因為方便管理,但使用默認配置文件,需要進行一些初始化動作。
由於完全采用/etc/pki/tls/openssl.cnf的配置,所以要建立相關文件。
自建CA的過程:
[root@xuexi tmp]# touch /etc/pki/CA/index.txt [root@xuexi tmp]# echo "01" > /etc/pki/CA/serial [root@xuexi tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem # 創建CA的私鑰 [root@xuexi tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.csr # 創建CA待自簽署的證書請求文件 [root@xuexi tmp]# openssl ca -selfsign -in rootCA.csr # 自簽署 [root@xuexi tmp]# cp /etc/pki/CA/newcerts/01.pem /etc/pki/CA/cacert.pem # 將自簽署的證書按照配置文件的配置復制到指定位置
為他人頒發證書的過程:
[root@xuexi tmp]# openssl ca -in youwant1.csr
簽署成功后,證書位於/etc/pki/CA/newcert目錄下,將新生成的證書文件發送給申請者即可。