基于 OpenSSL 自建 CA 和頒發 SSL 證書

更多精彩文章https://deepzz.com
Desc:基于 openssl,自建 CA,頒發證書

自建 CA 頒發證書不僅可以用來鑒權,而且使你的通信更加的安全(請保護好你的證書)。在實際的軟件開發中,越來越多的服務用到 HTTPS,證書的需求隨之增加。那么對于我們開發者,通過自簽名證書來進行測試必將非常的方便。so,有一個自己的 CA 是不是非常的庫呢!下面我們一步步操作,創建我們自己的 CA。

由于 Mac 自帶的 openssl 版本過低,請安裝更高版本。

建立 CA

所有命令均在同一目錄執行,沒有進行跳轉。

$ mkdir -p ./demoCA/{private,newcerts} && \
    touch ./demoCA/index.txt && \
    touch ./demoCA/serial && \
    echo 01 > ./demoCA/serial

通過以上命令,你將得到如下目錄:

$ tree
.
└── demoCA
    ├── index.txt
    ├── newcerts
    ├── private
    └── serial

生成 CA 根密鑰

$ openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048 #可以去掉des,以后簽證書不用輸密碼

生成 CA 證書請求

$ openssl req -new -days 3650 -key ./demoCA/private/cakey.pem -out careq.pem

自簽發 CA 根證書

$ openssl ca -selfsign -in careq.pem -out ./demoCA/cacert.pem

以上合二為一

$ openssl req -new -x509 -days 3650 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem

到這里,我們已經有了自己的 CA 了,下面我們開始為用戶頒發證書。

為用戶頒發證書

生成用戶 RSA 密鑰

$ openssl genrsa -des3 -out userkey.pem 2048 # 4096

生成用戶證書請求

$ openssl req -new -days 365 -key userkey.pem -out userreq.pem # NO SAN

$ openssl req -new -days 365 -key userkey.pem -out userreq.pem -config openssl.cnf #SAN

使用 CA 簽發證書

$ openssl ca -in userreq.pem -out usercert.pem # NO SAN

$ openssl ca -in userreq.pem -out usercert.pem -config openssl.cnf -extensions v3_req #SAN

其他證書操作

  • 查看證書的內容:$ openssl x509 -in cert.pem -text -noout
  • 吊銷證書:$ openssl ca -revoke cert.pem -config openssl.cnf
  • 證書吊銷列表:$ openssl ca -gencrl -out cacert.crl -config openssl.cnf
  • 查看列表內容:$ openssl crl -in cacert.crl -text -noout

openssl.cnf

上面步驟中,你可以觀察到 SANNO SAN 標記。那么什么是 SAN,SAN(Subject Alternative Name)是 SSL 標準 x509 中定義的一個擴展。使用了 SAN 字段的 SSL 證書,可以擴展此證書支持的域名,使得一個證書可以支持多個不同域名的解析。所以,只執行 NO SAN 命令也可以簽發證書,不過卻不能夠添加多個域名。

想要添加多個域名或泛域名,你需要使用到該擴展。那么默認的 OpenSSL 的配置是不能夠滿足的,我們需要復制或下載一份默認的 openssl.cnf 文件到本地。如 github openssl。這里我已經準備好一份 openssl.cnf

修改匹配策略

默認匹配策略是:國家名,省份,組織名必須相同(match)。我們改為可選(optional),這樣避免我們生成證書請求文件時(csr)去參考 CA 證書。

# For the CA policy
[ policy_match ]
countryName         = match
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName      = optional
commonName          = supplied
emailAddress            = optional

修改默認值

這是可選項,修改默認值,可以讓你更快的頒發證書,一直回車就可以了:

[ req_distinguished_name ]
countryName         = Country Name (2 letter code)
countryName_default     = CN
countryName_min         = 2
countryName_max         = 2

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = Shanghai

localityName            = Locality Name (eg, city)
localityName_default        = Shanghai

0.organizationName      = Organization Name (eg, company)
0.organizationName_default      = deepzz

# we can do this but it is not needed normally :-)
#1.organizationName     = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd

organizationalUnitName      = Organizational Unit Name (eg, section)
organizationalUnitName_default  = deepzz

關鍵步驟

最關鍵的地方是修改 v3_req。添加成如下:

[ v3_req ]

# Extensions to add to a certificate request

basicConstraints        = CA:FALSE
keyUsage            = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName          = @alt_names

[ alt_names ]
DNS.1 = abc.com
DNS.2 = *.abc.com
DNS.3 = xyz.com
IP.1 = 127.0.0.1

每次如果你要簽發不同域名或 IP,可以直接修改 [ alt_names ]

注意之后的操作,均要指定 -config openssl.cnf

再來看看我們的目錄結構:

$ tree
.
├── demoCA
│   ├── cacert.pem
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── newcerts
│   │   └── 01.pem
│   ├── private
│   │   └── cakey.pem
│   ├── serial
│   └── serial.old
├── openssl.cnf
├── usercert.pem
├── userkey.pem
└── userreq.pem
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1 概述 本文之所以稱之為半自動化,是因為證書的申請并非日常工作,只是一段時間才需要申請,同時,在創建證書和辦法證...
    ghbsunny閱讀 2,212評論 0 1
  • CA和證書安全協議(SSL/TLS)OpenSSH 一、CA和證書 (一) PKI(Public Key Infr...
    哈嘍別樣閱讀 1,420評論 0 0
  • 1.PKI: Public Key Infrastructure 簽證機構:CA(Certificate Auth...
    尛尛大尹閱讀 928評論 0 0
  • 貌似碼農很難找到高顏值女票,比如我們公司近百號碼農,收入也都還不錯,但女票漂亮的并不多,甚至很多2-3年了還找不到...
    方老司閱讀 1,976評論 1 2
  • 三 進入vim 1.使用vim命令進入vim界面 vim后面加上你要打開的已存在的文件名或者不存在(則作為新建文件...
    11010tianyi閱讀 241評論 0 0