openssl簽署和自簽署證書的多種實現方式


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目錄下,將新生成的證書文件發送給申請者即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM