1. 程式人生 > 其它 >生成證書

生成證書

基本知識

證書生成網站:

https://csr.chinassl.net/index.html

證書會包含一個伺服器的域名,或者包含多個域名( 多域名證書,SAN certificater == SubjectAltName Certificater)

自簽名證書:伺服器生成一個伺服器私鑰,然後通過私鑰生成證書請求檔案,正常情況是把 “ 證書請求檔案 ” 發給 CA 讓其用 CA 私鑰生成證書;如果 “ 證書請求檔案 ” 用伺服器私鑰而非CA私鑰生成證書,就叫做自簽名證書。伺服器使用自簽名證書就不需要匯入 CA 證書。

openssl req 命令主要的功能有,生成證書請求檔案, 檢視驗證證書請求檔案,還有就是生成自簽名證書。
以下就主要記錄一下openssl命令選項的意義,並記錄一下簡單的命令示例。

首先說明下生成證書請求需要什麼:申請者需要將自己的資訊及其公鑰放入證書請求中。但在實際操作過程中,
所需要提供的是私鑰而非公鑰,因為它會自動從私鑰中提取公鑰。另外,還需要將提供的資料進行數字簽名
(使用單向加密),保證該證書請求檔案的完整性和一致性,防止他人盜取後進行篡改,

主要命令選項:

-new :說明生成證書請求檔案
-x509 :說明生成自簽名證書
-key :指定已有的祕鑰檔案生成祕鑰請求,只與生成證書請求選項-new配合。
-newkey :-newkey是與-key互斥的,-newkey是指在生成證書請求或者自簽名證書的時候自動生成金鑰,
然後生成的金鑰名稱由-keyout引數指定。當指定newkey選項時,後面指定rsa:bits說明產生
rsa金鑰,位數由bits指定。 如果沒有指定選項-key和-newkey,預設自動生成祕鑰。
-out
:-out 指定生成的證書請求或者自簽名證書名稱
-config :預設引數在ubuntu上為 /etc/ssl/openssl.cnf, 可以使用-config指定特殊路徑的配置檔案
-nodes :如果指定-newkey自動生成祕鑰,那麼-nodes選項說明生成的祕鑰不需要加密,即不需要輸入passphase.
-batch :指定非互動模式,直接讀取config檔案配置引數,或者使用預設引數值

命令示例:

1.#生成自簽名證書,證書名client.crt,採用自動生成祕鑰的方式,指定生成祕鑰長度為1024,加密,祕鑰檔案client.key.
openssl req -x509 -newkey rsa:1024
-out client.crt -keyout client.key -batch -nodes
#上面的命令加上-new選項是同樣的執行效果
openssl req -new -x509 -newkey rsa:1024 -out client.crt -keyout client.key -batch -nodes  
2.#生成自簽名證書,證書名client.crt,指定祕鑰檔案,祕鑰檔案為rsa_private_key.pem。
openssl req -new -x509 -key ./rsa_private_key.pem -out client.crt -nodes -batch
#注意下面命令不能正確執行,不加-new 命令貌似不能指定祕鑰檔案
openssl req -x509 -key ./rsa_private_key.pem -out client.crt -nodes -batch
3.#指定祕鑰檔案pri_key.pem,生成證書請求檔案 req.csr
openssl req -new -key pri_key.pem -out req.csr
#使用req命令,以文字方式檢視剛生成的證書請求檔案
openssl req -in req1.csr -text
#檢視證書請求檔案的公鑰, 這個公鑰就是從pri_key.pem私鑰檔案匯出的公鑰
openssl req -in req1.csr -noout -pubkey
下列選項和-noout選項配合分別檢視證書請求檔案的部分內容
-noout -pubkey #檢視證書請求檔案的公鑰
-noout -subject #檢視證書請求檔案的個人資訊部分 最後可以通過man req 檢視詳細的openssl req的詳細資訊。

例項:生成自簽名證書

1、生成私鑰和證書請求檔案

openssl 有一個預設的配置檔案 openssl.cnf,路徑:

可參考 openssl.cnf 建立自己的配置檔案

新建檔案 san.conf,內容如下:

[ req ]
default_bits = 2048
default_keyfile = server_privateKey.pem
distinguished_name = req_distinguished_name
req_extensions = req_ext

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Fujian
localityName = Locality Name (eg, city)
localityName_default = Xiamen
organizationName = Organization Name (eg, company)
organizationName_default = none_company
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = IT
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
commonName_default = localhost

[ req_ext ]
subjectAltName = @alt_names

[alt_names]
DNS.1 = god1
DNS.2 = god2
DNS.3 = 192.168.0.1
DNS.4 = 127.0.0.1

執行以下命令:

openssl req -new -nodes -out myreq.csr -config san.conf -batch

或者

openssl genrsa -out server_privateKey.pem 2048
openssl req -new -out myreq.csr -key server_privateKey.pem -config san.conf -batch

檢視證書請求檔案

openssl req -text -noout -in myreq.csr

2、生成證書

生成帶有 SAN 域名的證書

openssl x509 -req -days 365 -in myreq.csr -signkey server_privateKey.pem -out server.crt -extensions req_ext -extfile san.conf

生成不帶 SAN 域名的證書

openssl x509 -req -days 365 -in myreq.csr -signkey server_privateKey.pem -out server.crt