天天看點

聯盟鍊系列 - 用Openssl頒發X.509證書

互動式 生成 X.509證書

(1)Root CA

  1. 生成CA的私鑰
  1. 生成CA的公鑰
openssl rsa -in ca/ca-prikey.pem -pubout -out ca/ca-pubkey.pem
           
  1. 生成CA的根證書
# 建立證書請求 
openssl req -new -out ca/ca-req.csr -key ca/ca-prikey.pem
      # 證書内容可選填 (其它 一路回車, 使用預設值)
      Organization Name (eg, company) : XXX
      Common Name (eg, YOUR name) []: root 
      
# 自簽署證書 (Create a self-signed certificate)
openssl x509 -req -in ca/ca-req.csr -out ca/ca-cert.pem -signkey ca/ca-prikey.pem -days 3650 

# (可選)将證書導出成浏覽器支援的.p12格式, 密碼: 123456       
openssl pkcs12 -export -clcerts -in ca/ca-cert.pem -inkey ca/ca-prikey.pem -out ca/ca.p12 
           

(2)使用根證書生成 一個node(即伺服器)的證書

  1. 生成node的私鑰
  1. 生成node的公鑰
openssl rsa -in ca/node-prikey.pem -pubout -out ca/node-pubkey.pem
           
  1. 使用根證書生成node的證書
# 建立證書請求
openssl req -new -out ca/node-req.csr -key ca/node-prikey.pem
      # 一路回車, 使用預設值, 直到 Common Name (注意: 一定要寫伺服器所在的ip位址)
      Organization Name (eg, company) : CMCC
      Common Name (eg, YOUR name) []: 127.0.0.1
      # 後續一路回車
      
# 使用CA憑證及密鑰對伺服器證書進行簽名
openssl x509 -req -in ca/node-req.csr -out ca/node-cert.pem -CA ca/ca-cert.pem -CAkey ca/ca-prikey.pem -CAcreateserial -days 3650 

# (可選)将證書導出成浏覽器支援的.p12格式, 密碼: 123456       
openssl pkcs12 -export -clcerts -in ca/node-cert.pem -inkey ca/node-prikey.pem -out ca/node.p12 
           

(3)使用根證書生成 一個用戶端的證書

  1. 生成client的私鑰
  1. 生成client的公鑰
openssl rsa -in ca/client-prikey.pem -pubout -out ca/client-pubkey.pem

openssl x509 -in ca/client-cert.pem -pubkey  -noout > ca/client-pubkey.pem
           
  1. 使用根證書生成client的證書
# 建立證書請求 
openssl req -new -out ca/client-req.csr -key ca/client-prikey.pem
      # 一路回車, 使用預設值, 直到 Common Name (注意: 可以填平台使用者名)
      Organization Name (eg, company) : General Motors
      Common Name (eg, YOUR name) []: voter1
      Email Address []: [預設]

      Please enter the following 'extra' attributes 
      to be sent with your certificate request 
      A challenge password []:123456 
      An optional company name []: testing  

# 自簽署證書
openssl x509 -req -in ca/client-req.csr -out ca/client-cert.pem -CA ca/ca-cert.pem -CAkey ca/ca-prikey.pem -CAcreateserial -days 3650  

# (可選)将證書導出成浏覽器支援的.p12格式, 密碼: 123456       
openssl pkcs12 -export -clcerts -in ca/client-cert.pem -inkey ca/client-prikey.pem -out ca/client.p12 
           

非互動式生成 X.509證書

(1)Root CA

# CA憑證及密鑰生成方法一----直接生成CA密鑰及其自簽名證書
# 如果想以後讀取私鑰檔案ca_rsa_private.pem時不需要輸入密碼,亦即不對私鑰進行加密存儲,那麼将-passout pass:123456替換成-nodes
openssl req -newkey rsa:2048 -passout pass:123456 -keyout ca_rsa_private.pem -x509 -days 365 -out ca.crt -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=CA/[email protected]"

# CA憑證及密鑰生成方法二----分步生成CA密鑰及其自簽名證書:
# openssl genrsa -aes256 -passout pass:123456 -out ca_rsa_private.pem 2048
# openssl req -new -x509 -days 365 -key ca_rsa_private.pem -passin pass:123456 -out ca.crt -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=CA/[email protected]"
# 如果生成證書時報錯: Error opening file "../crypto/rand/randfile.c", 沒關系, 版本大于1.1.1就不報了
           

(2)使用根證書生成 一個伺服器證書

# 伺服器證書及密鑰生成方法一----直接生成伺服器密鑰及待簽名證書
# 如果想以後讀取私鑰檔案server_rsa_private.pem時不需要輸入密碼,亦即不對私鑰進行加密存儲,那麼将-passout pass:server替換成-nodes
openssl req -newkey rsa:2048 -passout pass:server -keyout server_rsa_private.pem  -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=SERVER/[email protected]"

# 伺服器證書及密鑰生成方法二----分步生成伺服器密鑰及待簽名證書
# openssl genrsa -aes256 -passout pass:server -out server_rsa_private.pem 2048
# openssl req -new -key server_rsa_private.pem -passin pass:server -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=SERVER/[email protected]"

# 使用CA憑證及密鑰對伺服器證書進行簽名:
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca_rsa_private.pem -passin pass:123456 -CAcreateserial -out server.crt

# 将加密的RSA密鑰轉成未加密的RSA密鑰,避免每次讀取都要求輸入解密密碼
# 密碼就是生成私鑰檔案時設定的passout、讀取私鑰檔案時要輸入的passin,比如這裡要輸入“server”
openssl rsa -in server_rsa_private.pem -out server_rsa_private.pem.unsecure
           

(3)使用根證書生成 一個用戶端的證書

# 用戶端證書及密鑰生成方法一----直接生成用戶端密鑰及待簽名證書
# 如果想以後讀取私鑰檔案client_rsa_private.pem時不需要輸入密碼,亦即不對私鑰進行加密存儲,那麼将-passout pass:client替換成-nodes
openssl req -newkey rsa:2048 -passout pass:client -keyout client_rsa_private.pem -out client.csr -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=CLIENT/[email protected]"

# 用戶端證書及密鑰生成方法二----分步生成用戶端密鑰及待簽名證書:
# openssl genrsa -aes256 -passout pass:client -out client_rsa_private.pem 2048
# openssl req -new -key client_rsa_private.pem -passin pass:client -out client.csr -subj "/C=CN/ST=GD/L=SZ/O=COM/OU=NSP/CN=CLIENT/[email protected]"

# 使用CA憑證及密鑰對用戶端證書進行簽名:
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca_rsa_private.pem -passin pass:123456 -CAcreateserial -out client.crt

# 将加密的RSA密鑰轉成未加密的RSA密鑰,避免每次讀取都要求輸入解密密碼
# 密碼就是生成私鑰檔案時設定的passout、讀取私鑰檔案時要輸入的passin,比如這裡要輸入“client”
openssl rsa -in client_rsa_private.pem -out client_rsa_private.pem.unsecure
           
往期精彩回顧:
區塊鍊知識系列
密碼學系列
零知識證明系列
共識系列
公鍊調研系列
比特币系列
以太坊系列
EOS系列
Filecoin系列
聯盟鍊系列
Fabric系列
智能合約系列
Token系列