證書籤署請求

在公開密鑰基礎架構（PKI）系統，證書籤署請求（certificate signing request，CSR或certification request）是申請者發給證書頒發機構（ca）的消息，用於申請公開密鑰證書。通常包含用於簽發證書的公鑰、用於辨識的資訊（如域名）、完整性保護（如數字簽名）。當證書被簽署時，這兩部分都會被插入到證書中。CSR最常用格式是PKCS #10規範。

## 過程

在創建CSR之前，申請者先產生一個密鑰對，保持私鑰為秘密。CSR保護申請者的身份資訊（如X.509證書中區分名稱）用公鑰加密。CSR還包含了這個公鑰。

CSR中的典型DN資訊：

Distinguished_Name｜資訊｜描述｜例子

`CN`｜Common Name｜通用名稱。通常是需要證書籤名的完全合格域名(Fully Qualified Domain Name)（FQDN）｜、.wikipedia.org

`O`｜商業名字 / Organization｜通常是法律上的商業名字｜Wikimedia Foundation, Inc.

`OU`｜部門名字 / Organizational Unit｜如HR, Finance, IT

`L`｜城鎮｜San Francisco

`ST`｜省、州｜不應該使用縮寫｜California

`C`｜國家名字｜兩字母ISO國家代碼｜US

`MAIL`｜Email地址｜該組織中的證書管理人的email地址

如果申請成功，證書頒發機構（ca）用自己的私鑰簽發一個公開密鑰證書並發給申請者。

## 結構

證書包含三部分： Thus the private key is needed to produce, but it is not part of, the CSR.

- 證書請求資訊，包含了公鑰。為ASN.1的類型 CertificationRequestInfo
- 簽名演算法標識
- 證書請求資訊的數字簽名

## 例子

PKCS#10 標準化了使用X.509的CSR的二進位格式。使用OpenSSL的命令行工具可以解讀：

`openssl asn1parse -i -in ''your_request''`

Base64編碼的CSR的例子如下：

```
-----BEGIN CERTIFICATE REQUEST-----
MIICzDCCAbQCAQAwgYYxCzAJBgNVBAYTAkVOMQ0wCwYDVQQIDARub25lMQ0wCwYD
VQQHDARub25lMRIwEAYDVQQKDAlXaWtpcGVkaWExDTALBgNVBAsMBG5vbmUxGDAW
BgNVBAMMDyoud2lraXBlZGlhLm9yZzEcMBoGCSqGSIb3DQEJARYNbm9uZUBub25l
LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMP/U8RlcCD6E8AL
PT8LLUR9ygyygPCaSmIEC8zXGJung3ykElXFRz/Jc/bu0hxCxi2YDz5IjxBBOpB/
kieG83HsSmZZtR+drZIQ6vOsr/ucvpnB9z4XzKuabNGZ5ZiTSQ9L7Mx8FzvUTq5y
/ArIuM+FBeuno/IV8zvwAe/VRa8i0QjFXT9vBBp35aeatdnJ2ds50yKCsHHcjvtr
9/8zPVqqmhl2XFS3Qdqlsprzbgksom67OobJGjaV+fNHNQ0o/rzP//Pl3i7vvaEG
7Ff8tQhEwR9nJUR1T6Z7ln7S6cOr23YozgWVkEJ/dSr6LAopb+cZ88FzW5NszU6i
57HhA7ECAwEAAaAAMA0GCSqGSIb3DQEBBAUAA4IBAQBn8OCVOIx+n0AS6WbEmYDR
SspR9xOCoOwYfamB+2Bpmt82R01zJ/kaqzUtZUjaGvQvAaz5lUwoMdaO0X7I5Xfl
sllMFDaYoGD4Rru4s8gz2qG/QHWA8uPXzJVAj6X0olbIdLTEqTKsnBj4Zr1AJCNy
/YcG4ouLJr140o26MhwBpoCRpPjAgdYMH60BYfnc4/DILxMVqR9xqK1s98d6Ob/+
3wHFK+S7BRWrJQXcM8veAexXuk9lHQ+FgGfD0eSYGz0kyP26Qa2pLTwumjt+nBPl
rfJxaLHwTQ/1988G0H35ED0f9Md5fzoKi5evU1wG5WRxdEUPyt3QUXxdQ69i0C+7
-----END CERTIFICATE REQUEST-----
```

openssl解讀為ASN.1結構，其中第一個數是字節偏移值，d=深度, hl=當前類型的頭部長度, l=內容長度:

```
    0:d=0  hl=4 l= 716 cons: SEQUENCE
    4:d=1  hl=4 l= 436 cons:  SEQUENCE
    8:d=2  hl=2 l=   1 prim:   INTEGER           :00
   11:d=2  hl=3 l= 134 cons:   SEQUENCE
   14:d=3  hl=2 l=  11 cons:    SET
   16:d=4  hl=2 l=   9 cons:     SEQUENCE
   18:d=5  hl=2 l=   3 prim:      OBJECT            :countryName
   23:d=5  hl=2 l=   2 prim:      PRINTABLESTRING   :EN
   27:d=3  hl=2 l=  13 cons:    SET
   29:d=4  hl=2 l=  11 cons:     SEQUENCE
   31:d=5  hl=2 l=   3 prim:      OBJECT            :stateOrProvinceName
   36:d=5  hl=2 l=   4 prim:      UTF8STRING        :none
   42:d=3  hl=2 l=  13 cons:    SET
   44:d=4  hl=2 l=  11 cons:     SEQUENCE
   46:d=5  hl=2 l=   3 prim:      OBJECT            :localityName
   51:d=5  hl=2 l=   4 prim:      UTF8STRING        :none
   57:d=3  hl=2 l=  18 cons:    SET
   59:d=4  hl=2 l=  16 cons:     SEQUENCE
   61:d=5  hl=2 l=   3 prim:      OBJECT            :organizationName
   66:d=5  hl=2 l=   9 prim:      UTF8STRING        :Wikipedia
   77:d=3  hl=2 l=  13 cons:    SET
   79:d=4  hl=2 l=  11 cons:     SEQUENCE
   81:d=5  hl=2 l=   3 prim:      OBJECT            :organizationalUnitName
   86:d=5  hl=2 l=   4 prim:      UTF8STRING        :none
   92:d=3  hl=2 l=  24 cons:    SET
   94:d=4  hl=2 l=  22 cons:     SEQUENCE
   96:d=5  hl=2 l=   3 prim:      OBJECT            :commonName
  101:d=5  hl=2 l=  15 prim:      UTF8STRING        :*.wikipedia.org
  118:d=3  hl=2 l=  28 cons:    SET
  120:d=4  hl=2 l=  26 cons:     SEQUENCE
  122:d=5  hl=2 l=   9 prim:      OBJECT            :emailAddress
  133:d=5  hl=2 l=  13 prim:      IA5STRING         :none@none.com
  148:d=2  hl=4 l= 290 cons:   SEQUENCE
  152:d=3  hl=2 l=  13 cons:    SEQUENCE
  154:d=4  hl=2 l=   9 prim:     OBJECT            :rsaEncryption
  165:d=4  hl=2 l=   0 prim:     NULL
  167:d=3  hl=4 l= 271 prim:    BIT STRING
  442:d=2  hl=2 l=   0 cons:   cont [ 0 ]
  444:d=1  hl=2 l=  13 cons:  SEQUENCE
  446:d=2  hl=2 l=   9 prim:   OBJECT            :md5WithRSAEncryption
  457:d=2  hl=2 l=   0 prim:   NULL
  459:d=1  hl=4 l= 257 prim:  BIT STRING
```

## 使用openssl創建證書籤署請求

### 生成一個私鑰和一個 CSR

從頭開始創建一個 2048 位的私鑰（domain.key）和一個 CSR（domain.csr）：

`openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr`

其中選項-newkey rsa:2048指定密鑰應該是2048位，使用RSA演算法生成。選項-nodes指定私鑰沒有用密碼加密。這裡沒有包含-new選項，而是隱含在其中，表示正在生成一個CSR。還需要繼續回答 CSR 資訊提問，完成該過程：

```
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:
```

在這個命令中也可以使用-subj選項非交互式地添加CSR資訊：

```
-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"
```

### 從現有的私鑰中生成一個 CSR

如果已經有了私鑰，想用它向 CA 申請證書，使用這個方法。該命令基於現有的私鑰（domain.key）創建一個新的 CSR（domain.csr）：

`openssl req -key domain.key -new -out domain.csr`

其中選項 -key 指定一個現有的私鑰（domain.key)，它將被用來生成一個新的 CSR。選項 -new 表示正在生成一個 CSR。繼續回答 CSR 資訊提問，完成該過程。

### 從現有的證書和私鑰生成 CSR

如果想更新現有的證書，但由於某些原因，你或你的 CA 沒有原始的 CSR，使用這個方法可以省去重新輸入 CSR 資訊的麻煩，因為是從現有證書中提取資訊。該命令基於現有的證書（domain.crt）和私鑰（domain.key）創建一個新的 CSR（domain.csr）：

`openssl x509 -in domain.crt -signkey domain.key -x509toreq -out domain.csr`

其中選項 -x509toreq 指定使用一個 X509 證書來製作 CSR。