[雲端] 憑證
===
###### tags: `雲端`, `憑證`
<br>
[TOC]
<br>
## 術語
| 英文術語 | 全名 | 中文術語 / 補充 |
| ------ | ---- | ------------- |
| Private Key | | 私密金鑰 |
| CA | Certificate Authority | [認證機構](http://terms.naer.edu.tw/detail/1274192/) |
| CFSSL | CloudFlare's SSL<br>[CloudFlare's PKI toolkit](https://cfssl.org/) | [CloudFlare(雲端中的防火牆)](https://medium.com/starrocket/cloudflare-firewall-in-the-cloud-its-mission-is-to-help-build-a-better-internet-2ccf4ed1a199)<br>Cloud 是雲,Flare 是閃耀的火光 |
| CRT | Certificate | 憑證, .crt 憑證檔案 |
| CSR | Certificate Signing Request | [憑證簽發請求](https://www.sslbuyer.com/index.php?option=com_content&view=article&id=56:what-is-csr&catid=19&Itemid=2595), [憑證簽署要求](https://haway.30cm.gg/ssl-key-csr-crt-pem/) |
| PEM | Privacy-Enhanced Mail | [隱私增強郵件](http://terms.naer.edu.tw/detail/1284464/), .pem 中繼憑證檔案 |
| PKI | Public key infrastructure | 公開金鑰基礎建設 |
| SSL | Secure Socket Layer | 安全通訊協定 |
| TLS | Transport Layer Security | 傳輸層安全性協定 |
<br>
## [購買 SSL 憑證](https://www.sslbuyer.com/index.php?option=com_content&view=article&id=56:what-is-csr&catid=19&Itemid=2595)
### 步驟
- 產生 CSR 檔案
- 提供給廠商 (到廠商提供的網頁介面,上傳 CSR 檔案)
- 廠商:發證商
- 開始後續的申請流程
<br>
## [製作 CSR 檔案](https://www.sslbuyer.com/index.php?option=com_content&view=article&id=56:what-is-csr&catid=19&Itemid=2595)
### 使用準則
- 多網域
- Common Name: www.sslbuyer.com,www.sslbuyer2.com
- 萬用網域
- Common Name: *.domain.com
- 金鑰長度
- 2048 位元以上才夠安全
- 加密演算法
- RSA為主
- 雜湊函數演篹法
- 2014年以前:SHA1
- 現在:SHA2
### 使用 openssl 工具會輸出
- 私密金鑰(Private Key) (自行保存)
- CSR 檔案 (給發證商)
<br>
<hr>
<br>
## openssl 工具說明
### openssl
```bahs
openssl command [ command_opts ] [ command_args ]
```
### [openssl req](https://www.sslbuyer.com/index.php?option=com_content&view=article&id=56:what-is-csr&catid=19&Itemid=2595)

- #### 補充說明
- 如果有帶 ```-x509``` 參數,輸出檔案就是 .crt (certificate)
- 反之,預設輸出檔案就是 .csr (Certificate Signing Request)
- #### ```-new```
new request.
- #### ```-newkey``` <-- new 或 newkey 至少要有一個,不然程式就卡在那裡
- #### ```-newkey rsa:bits```
generate a new RSA key of 'bits' in size
- #### ```-newkey dsa:file```
generate a new DSA key, parameters taken from CA in 'file'
- #### ```-newkey ec:file```
generate a new EC key, parameters taken from CA in 'file
- #### ```-nodes``` <-- 有無此參數,看不出結果差異性
don't encrypt the output key
- #### ```-out arg``` <-- 輸出CSR(Certificate Signing Request)檔案
output file
- #### ```-keyout arg``` <-- 輸出私密金鑰
file to send the key to
- #### ```-subj arg``` <-- 根據你的資料,產生「CSR」和「私密金鑰」
set or modify request subject
- CN: Common Name :此欄位為你要保護的網域名稱
- Organization [O]:您組織的名稱,此名稱要與您合法登記的名稱一樣
- Organizational Unit:[OU]:公司部門,若沒填寫則跟Common Name相同
- Locality [L]:公司所在地的城市名稱
- State [ST]:公司所在地的州或郡
- Country [C]:公司所在地的國家
- Key Size:憑證演算法與金鑰長度
- #### 實際範例

**執行指令**
```
$ openssl req -new -newkey rsa:2048 -nodes \
-out tj_tsai.csr \
-keyout tj_tsai.key \
-subj "/C=TW/ST=NONE/L=TAINAN/O=ASUS/OU=OCIS/CN=10.78.154.134"
```
- 若將 ```/C=TW``` 輸入為 ```/C=台灣```,會出現底下錯誤訊息 (字串太長,最大長度=2)
```
problems making Certificate Request
139634691958424:error:0D07A097:asn1 encoding routines:ASN1_mbstring_ncopy:string too long:a_mbstr.c:158:maxsize=2
```
- 每次執行,都會得到不一樣的 tj_tsai.csr 和 tj_tsai.key
<br>
**執行結果**
```
Generating a 2048 bit RSA private key
..........+++
............................................................................................+++
writing new private key to 'tj_tsai.key'
-----
```
<br>
**查看 tj_tsai.csr 內容** (CSR, Certificate Signing Request)
```bash
$ cat tj_tsai.csr
-----BEGIN CERTIFICATE REQUEST-----
MIICqDCCAZACAQAwYzELMAkGA1UEBhMCVFcxDTALBgNVBAgMBE5PTkUxDzANBgNV
...
...
...
TQAgU1TO1LqTplsEHHFOjN+lDmZplE5xlo4xAOqc6TXBonJtbwD3fMuPEi/xFw7i
02BJAUE0vaxxmFTr
-----END CERTIFICATE REQUEST-----
```
<br>
**查看 tj_tsai.key 內容**
```bash
$ cat tj_tsai.key
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDjzAOlJvHO2hH6
...
...
...
ZN47q7oPbI06DlwXKXuFZFw9vt6EBSbxo5KueuUGzXcQdYpC08g0iHiM0wO65g2z
A5p5nQgwjVfJOU4e94LWSky3
-----END PRIVATE KEY-----
```
<br>
**使用「互動式方式」建立**
```bash
$ openssl req -new -nodes # -keyout tj_tsai.key
Generating a 2048 bit RSA private key
......+++
.....+++
writing new private key to 'privkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:NONE
Locality Name (eg, city) []:TAINAN
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ASUS
Organizational Unit Name (eg, section) []:OCIS
Common Name (e.g. server FQDN or YOUR name) []:10.78.154.134
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
-----BEGIN CERTIFICATE REQUEST-----
MIICqDCCAZACAQAwYzELMAkGA1UEBhMCVFcxDTALBgNVBAgMBE5PTkUxDzANBgNV
BAcMBlRBSU5BTjENMAsGA1UECgwEQVNVUzENMAsGA1UECwwET0NJUzEWMBQGA1UE
...
...
...
3skeMNljB76V+cm8OITuRP7uHR4o/StGgkzq9a53Or34MUPn35U0uqjJcTu5d5bn
wCt2g1iz1BRUKeDRwNYEDFlCF4aVO275vIsqJ+1SAVRmKypPjmxMjIEc/uAB/KMC
Ho2jEmOTbLPJhBaP
-----END CERTIFICATE REQUEST-----
```
### [openssl genrsa](https://scriptcrunch.com/create-ca-tls-ssl-certificates-keys/)
- #### ```-out file```
output the key to 'file
- #### 實際範例
**執行指令**
```
$ openssl genrsa -out ca.key 2048
```
<br>
**查看 tj_tsai.key 內容**
```bash
$ cat ca.key
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA2g5uNP7odup5Ysf3kpZp0xPq0hFnfoMFwfc1Mp1ZCYLIu3my
be7YxUt2wcHTgZG1fxHSL6vElNX3NqmSQ6+e76hbNACvzdsltLVspvwn1O7fUJAu
...
...
...
y0CpHtOCvBAvIJQkTv74HuZJhB0ptUbk6sYx31TfDTacIFtOX2TN857uhzMPhSF7
bBEjEXpoA3EmGO1irnWgch3Ugap2Y55yfmMO94ce67sTqoNgvIgJ+z8=
-----END RSA PRIVATE KEY-----
```
<br>
## 參考資料-cht
- [CSR(CERTIFICATE SIGNING REQUEST)是甚麼?](https://www.sslbuyer.com/index.php?option=com_content&view=article&id=56:what-is-csr&catid=19&Itemid=2595)
- [[SSL 基礎]私有金鑰、CSR 、CRT 與 中繼憑證](https://haway.30cm.gg/ssl-key-csr-crt-pem/)
- [openssl 指令 command line](https://ssorc.tw/42/openssl-%E6%8C%87%E4%BB%A4/)

<br>
## 參考資料-en
- [How to Configure SSL on Jenkins Server](https://devopscube.com/configure-ssl-jenkins/)
- [How To Create CA and Generate SSL/TLS Certificates & Keys](https://scriptcrunch.com/create-ca-tls-ssl-certificates-keys/)