---
# System prepended metadata

title: 用 Openssl 玩自己的 ssl 憑證

---

# 用 Openssl 玩自己的 ssl 憑證

基本名詞
- **ca** (Certificate Authority) 憑證簽發者，負責「發」、「簽」及「廢止」憑證，在完整的 pki 系統中，可能有多層次 ca 如 root ca、 intermediate 及 end
- **ra** (Registration Authority) 申請憑證的地方，負責驗證申請者的資料/人，並將申請資料建立為 csr 向 ca 申請
- **va** (Validation Authority) 驗證憑證者，負責驗證憑證是否為有效憑證，提供 OCSP/CRL 的服務
- **csr** (Certificate Sign Request) 使用者向 ca 請求憑證的檔案，ca 簽出來會得到 crt 及 key
- **crt** (Certificate) 憑證檔
- **key** (Certificate Key) 憑證檔 private key
- **pki** (Public Key Infrastructure)

## 自簽憑證 (沒有獨立 ca 的玩法)

自建 x509 格式的 key 及 crt
`openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout <keyname>.key -out <certname>.crt`
- `x509` 憑證格式
- `-nodes` 指 key 不要加密 (no data encryption standard)
- `-newkey rsa:2048` 設定 key 長度為 rsa 2048，注意需考量 client / server side 效能及硬體支援程度

由上方指令產出的 *.key 為 plain text 檔，可直接 `cat *.key` 檢視
*.crt 則為 PEM 憑證檔，可使用 `openssl x509 -in <crtname>.crt -text` 檢視

在所使用的 web server 設定相對應的 *.crt 及 *.key 後，將此 *.crt 匯入 client 機器或 browser 即可

## 自簽憑證 (有獨立 ca 的玩法)

需先建出 ca ，使用端建出 csr，再由 ca 簽出對應的 key 及 crt

**發發憑證方建立 ca**
第一步產 ca key
`openssl genrsa -out <caname>.key 2048` 產生 ca private key (這個 key 流出就出大事了)

第二步利用 key 產 ca crt
`openssl req -new -x509 -days 365 -sha256 -key <keyname>.key -out <crtname>.crt` key 為第一步產出來的 key

**使用方建立 csr**
第一步產使用方 private key
`openssl genrsa -out <keyname>.key 2048`

第二步利用 key 產出所需的 csr
`openssl req -new -key <keyname>.key -out <csrname>.csr`

*或是一口氣把 key 跟 csr 都產出來
`openssl req -new -newkey rsa:2048 -nodes -out <csrname>csr -keyout <keyname>.key` 若要加 ext 則再加上 `-addext "subjectAltName=DNS:<FQDN>"`

**發證方依使用方 csr 簽憑證**
這件事在 ca 的機器上才有可能做到，需用到 ca key 及 ca crt (重點是 ca key)
`openssl x509 -req -CAcreateserial -days 30 -sha256 -CA <cacrtname>.crt -CAkey <cakeyname>.key -in <reqcsrname>.csr -out <crtname>.crt` 此指令使用 ca 的 key 及 crt 依照 csr 產出使用方用的 crt

依此流程，可在 client 的 ca 匯入步驟一產出的 ca，則所有使用此 ca 簽發的 crt 的 server 都可以通過驗證

一般使用者的 OS、Browser 及各個 Application 有些使用 OS 的 ca list，也可能有各自的 ca list，在匯入 ca 時需注意可能會因使用的 application 不同而需用不同的方式匯入。

## 補充

尚未深入研究其他 crt 用途及驗證設定，結論 openssl 讚啦