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

openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml


1.採用自定義配置文件的實現方法

1.1 自建CA

自建CA的機制:1.生成私鑰;2.建立證書請求;3.使用私鑰對證書請求籤名。vim

因爲測試環境,因此自建的CA只能是根CA。所使用的配置文件以下。dom

[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中其實生成私鑰和證書申請能夠合併在一步中完成,證書申請和簽名也能夠合併在一步中完成。ui

方法一:一步完成加密

在下面的一步命令中,使用-new因爲沒有指定私鑰輸出位置,因此自動保存在ssl.conf中default_keyfile指定的private.pem中;因爲ssl.conf中的req段設置了encrypt_key=no,因此交互時不須要輸入私鑰的加密密碼;因爲使用req -x509自簽名的證書有效期默認爲30天,而配置文件中req段又不能配置該期限,因此只能使用-days來指定有效期限,注意這個-days選項只做用於x509簽名,證書請求中若是指定了時間是無效的。spa

[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

方法二:分步完成,這裏把各類可能的步驟合併都演示一遍code

>>建立私鑰和證書請求合併而簽名獨自進行的方法<<htm

[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

>>獨自生成私鑰,而請求和簽名合併的方法<<blog

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

相關文章
相關標籤/搜索