
# 生成证书
合作伙伴可以购买使用商业CA签发的证书，也可以使用OpenSSL工具生成的免费证书。对于使用OpenSSL工具生成证书的命令较多，这里给出推荐的生成证书的OpenSSL命令供参考。
1. 生成CA的RSA公私钥对。
   
   命令：**openssl genrsa** \[**-out** ***filename* \] \[*-aes256* \] \[*numbits*\]**
   样例：**openssl genrsa -out CAkey.pem -aes256 2048**
   命令执行时会在OpenSSL界面上提示用户自己手动输入生成的私钥文件的保护口令。该口令会自动派生出加密密钥，对私钥文件做加密保护。
   表1生成CA的RSA公私钥对参数说明 
   | 参数                | 说明                                                                                                                                                                                                          |
   |:---|:---|
   | \[-out filename\] | 输出的存放公私钥对的文件名及路径。                                                                                                                                                                                           |
   | \[-aes256\]       | 表明私钥文件的加密算法是AES256-CBC。 这里也可以选择-des、-des3、-aes128、-idea等加密算法，对称加密算法建议使用：AES（128位及以上），所以这里我们推荐使用-aes256加密算法。如果在生成公私钥对的命令中不指定加密算法，则生成的公私钥文件是没有口令保护的。 |
   | \[numbers\]       | 指生成的公私钥对的长度，非对称加密算法建议使用：RSA（2048位及以上），所以这里推荐的公私钥对长度为2048bit。                                                                                                                                                |
      
   ![](https://support.huaweicloud.com/devg-bpconsole/zh-cn_image_0178832097.png "点击放大")
   
   
   
2. 使用CA自己的私钥签发自签名CA根证书。
   
   命令：**openssl req \[-x509\] \[-new\] \[-key *filename* \] \[-out*filename* \] \[-md2\|-md5\|-sha1\|-mdc2\|-sha256\] \[-days n\] \[-config *path of openssl.cnf*\]**
   样例：**openssl req -x509 -new -key CAkey.pem -sha256 -out CA.pem -days 3650 -config *openssl.cnf***
   样例中的"Cakey.pem"为[1]中生成的私钥文件。命令执行时会在OpenSSL界面上提示用户自己手动输入[1]生成的私钥文件的保护口令以及输入证书申请者的信息值。
    表2使用CA自己的私钥签发自签名CA根证书参数说明 
   | 参数                                    | 说明                                                                                                                                |
   |:---|:---|
   | \[-x509\]                             | 本参数将产生自签名的证书，即Root CA根证书，证书的扩展项在config文件里面指定。                                                                                     |
   | \[-new\]                              | 本参数产生一个新的证书请求文件CSR（Certificate Secure Request，如果该参数和-x509参数一起使用，则是生成一个自签名的根证书文件），它会要用户输入创建CSR的一些必须的信息。至于需要哪些信息，是在config文件里面定义好了的。 |
   | \[-key filename\]                     | 指定证书私钥文件的来源。允许该文件的格式是PKCS#8。                                                                                                      |
   | \[-out filename\]                     | 输出证书请求文件（如果前面有-x509参数，则表明此处输出的是自签名根证书文件），默认为标准输出。                                                                                 |
   | \[-md2\|-md5\|-sha1\|-mdc2\|-sha256\] | 指定证书的哈希算法，建议签名场景使用SHA256，另外因为在[1]中生成的是RSA的公私钥对，所以此处的签名算法为SHA256RSA。       |
   | \[-days n\]                           | 指定被签名证书的有效期限。如果不指定该参数，则生成证书的有效期默认为30天。一般我们建议生成的证书有效期为10年，即n取值为3650。                                                               |
   | \[-config path of openssl.cnf\]       | 指定openssl.cnf配置文件的绝对路径和文件名。                                                                                                       |
      
   ![](https://support.huaweicloud.com/devg-bpconsole/zh-cn_image_0178832055.png "点击放大")
   
   
   
3. 生成设备证书的公私钥对。
   
   生成设备证书公私钥对的命令，同生成CA证书公私钥对的命令。
   样例：**openssl genrsa -out Devicekey.pem -aes256 2048**
   这里的Devicekey.pem为存放设备证书公私钥的文件。命令执行时会在OpenSSL界面上提示用户自己手动输入生成的私钥文件的保护口令。该口令会自动派生出加密密钥，对私钥文件做加密保护。
   ![](https://support.huaweicloud.com/devg-bpconsole/zh-cn_image_0178832074.png "点击放大")
   
   
4. 生成设备证书的证书请求文件。
   
   命令：**openssl req \[-new\] \[-key *filename* \] \[-out*filename*\] \[-config path of openssl.cnf\]**
   样例：**openssl req -new -key Devicekey.pem -out DeviceCert.csr -config openssl.cnf**
   样例中的"Devicekey.pem"为[3]中生成的私钥文件。命令执行时会在OpenSSL界面上提示用户自己手动输入[3]生成的私钥文件的保护口令以及输入证书申请者的信息值。
   命令中的参数说明请参见[表2]。
   ![](https://support.huaweicloud.com/devg-bpconsole/zh-cn_image_0178832100.png "点击放大")
   
   
5. 使用CA私钥签发设备证书。
   
   命令：**openssl x509 \[-req\] \[-in filename\] \[-out filename\] \[-CA filename\] \[-CAkey filename\] \[-md2\|-md5\|-sha1\|-mdc2\|-sha256\] \[-days arg\] \[-CAcreateserial\] \[-extfile filename\] \[-extensions v3_req\]**
   样例：****openssl**x509 -req -in DeviceCert.csr -out DeviceCert.pem -CA CA.pem -CAkey CAkey.pem -sha256 -days 3650 -CAcreateserial -extensions v3_req -extfile openssl.cnf**
   命令执行时会在OpenSSL界面上提示用户自己手动输入[1]生成的根CA私钥文件的保护口令。
   表3使用CA私钥签发设备证书参数说明 
   | 参数                                    | 说明                                                                                                                                   |
   |:---|:---|
   | \[-req\]                              | 在x509命令中，该参数说明输入文件（"-in"参数后面的文件）是证书请求文件CSR。                                                                                          |
   | \[-in filename\]                      | 指定输入文件名，这里我们输入的文件是[4]中生成的设备证书请求文件。                                         |
   | \[-out filename\]                     | 指定输出文件名，这里指被签名后的设备证书文件。                                                                                                              |
   | \[-CA filename\]                      | 指定签名用的CA的证书文件名，即[2]中生成的证书请求文件。                                              |
   | \[-CAkey filename\]                   | 指定CA私有密钥文件，即[1]生成CA的RSA公私钥对。                                                 |
   | \[-md2\|-md5\|-sha1\|-mdc2\|-sha256\] | 指定证书的哈希算法，建议签名场景使用SHA256，另外因为在[1]中生成的是RSA的公私钥对，所以此处的签名算法为SHA256RSA。          |
   | \[-days n\]                           | 指定被签名证书的有效期限。如果不指定该参数，则生成证书的有效期默认为30天。一般我们建议生成的证书有效期为10年，即n取值为3650。                                                                  |
   | \[-CAcreateserial\]                   | 如果没有CA系列号文件（默认文件名为CA.srl），那么本option将生成一个，如果有默认的CA.srl文件，则直接使用该文件，且以后每签发一个证书，序列号增加1。                                                  |
   | \[-extfile filename\]                 | 指定包含证书扩展项的文件名，这里为openssl.cnf文件。如果没有该参数，那么生成的证书将没有任何扩展项，即生成的是x.509 v1版本的证书。                                                           |
   | \[-extensions section\]               | 指定签发的证书文件中包含要增加的扩展项，如果不指定该参数，则默认为v3_ca，即CA根证书，这里要签发设备证书，所以此处的section取值为v3_req，代表生成的证书中证书的基本约束是"Subject Type=End Entity"，即该证书是终端实体证书。 |
      
   ![](https://support.huaweicloud.com/devg-bpconsole/zh-cn_image_0178832067.png "点击放大")
   
   
6. [5]中生成的DeviceCert.pem文件正文去头尾即为[IDP Metadata.xml示例（使用UTF-8编码保存）](https://support.huaweicloud.com/devg-bpconsole/access_00001.html#access_00001__zh-cn_topic_0178832058_section055245811331)中\<ds:X509Certificate\> \</ds:X509Certificate\>内的值。
 
