ssl證書生成指南


*名詞解析

  • SSL:Secure Socket Layer,安全套接字層,它位於TCP層與Application層之間。提供對Application數據的加密保護(密文),完整性保護(不被篡改)等安全服務。
  • TLS:Transport Layer Secure,提供安全的傳輸服務,十分靈活,可以使用在TCP上,也可以使用在UDP上,也可以使用在數據鏈路層上。
  • 公鑰:大家公用的,可以被其他人下載,用來加密和驗章。
  • 私鑰:自己私有,須小心保存,用來解密和簽章。
  • 數字簽名:將報文按雙方約定的HASH算法計算得到一個固定位數的報文摘要。在數學上保證:只要改動報文中任何一位,重新計算出的報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。將該報文摘要值用發送者的私人密鑰加密,然后連同原報文一起發送給接收者,而產生的報文即稱數字簽名。
  • 數字證書:數字證書就是互聯網通訊中標志通訊各方身份信息的一系列數據,提供了一種在Internet上驗證您身份的方式,其作用類似於司機的駕駛執照或日常生活中的身份證。它是由一個由權威機構-----CA機構,又稱為證書授權(Certificate Authority)中心發行的,人們可以在網上用它來識別對方的身份。數字證書是一個經證書授權中心數字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個公開密鑰、名稱以及證書授權中心的數字簽名。
  • CA:Certificate Authority,證書授權中心。是一個單位,來管理發放數字證書的。由它發放的證書就叫 CA 證書,以區別於個人使用工具隨意生成的數字證書,查看 CA 證書,里面有兩項重要內容,一個是頌發給誰,另一個是由誰頌發的。

*常見證書格式類型

SSL證書主要的文件類型和協議有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL、OCSP、SCEP等。

DER

該格式是二進制文件內容,Java 和 Windows 服務器偏向於使用這種編碼格式。
OpenSSL 查看:

openssl x509 -in certificate.der -inform der -text -noout


轉換為 PEM:

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

PEM

Privacy Enhanced Mail,一般為文本格式,以 -----BEGIN... 開頭,以 -----END... 結尾。中間的內容是 BASE64 編碼。這種格式可以保存證書和私鑰,有時我們也把PEM 格式的私鑰的后綴改為 .key 以區別證書與私鑰。具體你可以看文件的內容。
這種格式常用於 Apache 和 Nginx 服務器。
OpenSSL 查看:

openssl x509 -in certificate.pem -text -noout

轉換為 DER:

openssl x509 -in cert.crt -outform der -out cert.der

CRT

Certificate 的簡稱,有可能是 PEM 編碼格式,也有可能是 DER 編碼格式。如何查看請參考前兩種格式。

PFX

Predecessor of PKCS#12,這種格式是二進制格式,且證書和私鑰存在一個 PFX 文件中。一般用於 Windows 上的 IIS 服務器。改格式的文件一般會有一個密碼用於保證私鑰的安全。
OpenSSL 查看:

openssl pkcs12 -in for-iis.pfx

轉換為 PEM:

openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes

JKS

Java Key Storage,很容易知道這是 JAVA 的專屬格式,利用 JAVA 的一個叫 keytool的工具可以進行格式轉換。一般用於 Tomcat 服務器。

*證書管理工具

openssl

OpenSSL 是一個開源項目,其組成主要包括一下三個組件:

  • openssl:多用途的命令行工具
  • libcrypto:加密算法庫
  • libssl:加密模塊應用庫,實現了ssl及tls

openssl可以實現:秘鑰證書管理、對稱加密和非對稱加密 。
openssl安裝:

# ubuntu
sudo apt install openssl -y
# centos
sudo yum install openssl -y

cfssl

CFSSL是CloudFlare開源的一款PKI/TLS工具。 CFSSL 包含一個命令行工具 和一個用於 簽名,驗證並且捆綁TLS證書的 HTTP API 服務。 使用Go語言編寫。
cfssl安裝:

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

certbot

Let’s Encrypt提供了免費的證書申請服務,而官方客戶端就是certbot。
certbot安裝:

# ubuntu
sudo apt install certbot -y
# centos
sudo yum install epel-release -y
sudo yum makecache fast
sudo yum install certbot -y

*證書類型

client certificate

用於服務端認證客戶端,例如etcdctl、etcd proxy、fleetctl、docker客戶端

server certificate

服務端使用,客戶端以此驗證服務端身份,例如docker服務端、kube-apiserver

peer certificate

雙向證書,用於etcd集群成員間通信

*證書文件約定

后綴

  • .key:私鑰文件
  • .csr:證書請求文件
  • .pem:證書文件

文件名

  • *-key.pem:私鑰文件
  • *-csr.json:證書請求配置文件

*證書生成

通過openssl生成證書

  1. 創建CA根證書
# 創建ca私鑰
openssl genrsa -out ca.key 2048

# 創建csr(證書請求文件),其中-subj參數含義
  #    參數     意義
  #     C       國家
  #	ST	省
  #	L	市
  #	O	組織名稱
  #	OU	組織單元名稱
  #	CN	命令名稱(如果是服務器證書則寫為域名)
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=BeiJing/L=BeiJing/O=jiaotong/OU=gaotie/CN=ROOTCA"

# 通過ca.csr簽署ca根證書
openssl x509 -req -in ca.csr -out ca.pem -signkey ca.key -days 3650
  1. 創建服務器證書
# 創建服務器私鑰文件
openssl genrsa -out server.key 2048

# 創建證書請求文件
# 其中輸入的信息中最重要的為CN,這里輸入的域名即為我們要使用https訪問的域名。
# 同時也可以使用泛域名如*.gisuni.com來生成所有二級域名可用的網站證書
openssl req -new -out server.csr -key server.key -subj "/C=CN/ST=BeiJing/L=BeiJing/O=jiaotao/OU=gaotie/CN=www.gaotie.test"

# 創建服務器證書
openssl x509 -req -in server.csr -out server.pem -signkey server.key -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650
  1. 校驗證書
# 校驗證書信息
openssl verify -CAfile ca.pem  server.pem
  1. 查看證書
# 打印證書內容
openssl x509 -in server.pem -noout -text

# 打印出證書的系列號
openssl x509 -in server.pem -noout -serial

# 打印csr文件內容
openssl req -in server.csr -noout -text
  1. 創建客戶端證書
# 創建客戶端私鑰文件
openssl genrsa -out client.key 2048

# 創建證書請求文件
openssl req -new -out client.csr -key client.key -subj "/C=CN/ST=BeiJing/L=BeiJing/O=jiaotong/OU=gaotie/CN=Client"

# 創建客戶端證書
openssl x509 -req -in client.csr -out client.pem -signkey client.key -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650
  1. 證書格式轉換
# 把PEM格式(文本)的證書轉化成DER格式(二進制)
openssl x509 -in server.pem -inform PEM -out server.der -outform DER

# 把證書轉化成CSR文件
openssl x509 -x509toreq -in server.pem -out server-req.csr -signkey server.key

# 把PEM格式的證書轉化為PFX格式證書
openssl pkcs12 -export -inkey server.key -in server.pem -out server.pfx

# 把PFX格式證書轉化為PEM格式證書
openssl pkcs12 -in server.pfx -nodes -out server-pfx.cert
openssl rsa -in server-pfx.cert -out server-pfx.key
openssl x509 -in server-pfx.csr -out server-pfx.pem

通過cfssl生成pem證書

  1. 創建CA證書
# 生成ca配置文件、證書請求文件
cfssl print-defaults config >ca-config.json
cfssl print-defaults csr >ca-csr.json
# 修改ca-config.json后內容:
# 字段說明: profiles,分別指定不同的過期時間、使用場景等參數;后續在簽名證書時使用某個profile;
# signing:表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
# server auth:表示client可以用該 CA 對server提供的證書進行驗證;
# client auth:表示server可以用該CA對client提供的證書進行驗證;
{
    "signing": {
        "default": {
            "expiry": "87600h"
        },
        "profiles": {
            "server": {
                "expiry": "87600h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "87600h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            }
        }
    }
}

# 修改ca-csr.json后
{
    "CN": "GiStack CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}

# 創建CA私鑰和證書
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# 生成三個文件
ca.csr(證書請求)  ca-key.pem(私鑰)  ca.pem(證書)
  1. 創建服務器證書
# 創建服務器請求文件
cfssl print-defaults csr >server-csr.json
# 修改server-csr.json文件
# hosts 支持多個,可以為ip,單域名,泛域名
{
    "CN": "gaotie",
    "hosts": [
        "www.gaotie.org",
        "*.gaotie.com",
        "172.17.10.100"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}

# 創建服務器私鑰和證書
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server

# 生成文件
server.csr  server-key.pem  server.pem
  1. 創建客戶端證書
# 創建客戶端請求文件
cfssl print-defaults csr >client-csr.json

# 修改client-csr.json文件
{
    "CN": "client",
    "hosts": [],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}

# 創建客戶端私鑰證書
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client
# 生成三個文件
client.csr   client-key.pem  client.pem
  1. 查看證書內容
# 查看服務器證書
cfssl-certinfo -cert server.pem

# 通過openssl查看證書內容
openssl x509 -in server.pem -noout -text

# 通過openssl校驗證書
openssl verify -CAfile ca.pem  server.pem

通過certbot申請letsencrypt簽發的證書

前置條件

  • 擁有正式的域名所有權
  • 擁有域名DNS解析修改權

安裝

# ubuntu
sudo apt install certbot -y

# centos
sudo yum install certbot -y

通過DNS申請證書

# 參數說明 更多詳細介紹:https://certbot.eff.org/
## certonly 僅僅申請證書,不按照
## -d 申請域名,支持單域名和通配域名
## --manual 使用交互式或腳本鈎子的方式獲取證書
## --preferred-challenges 指定域名校驗方式,支持dns,http,tls-sni-01
## --server 證書申請API地址
certbot certonly -d *.gaotie.dev --manual --preferred-challenges dns \
--server https://acme-v02.api.letsencrypt.org/directory

image.png
設置完成DNS TXT記錄后,等待1分鍾左右,按回車進行域名校驗並簽發證書。

證書管理

證書文件存儲目錄/etc/letsencrypt/live/域名
image.png


免責聲明!

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



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