创建公钥/私钥对

Google IoT Core

bookmark_border
本页面介绍如何使用 OpenSSL 命令行工具生成公钥/私钥对。

设备身份验证
Cloud IoT Core 使用公钥(或非对称)身份验证:

设备使用私钥来对 JSON Web 令牌 (JWT) 进行签名。该令牌会传递到 Cloud IoT Core 作为设备身份的证明。
服务使用设备公钥(在发送 JWT 之前上传)来验证设备的身份。
Cloud IoT Core 支持 RSA 和椭圆曲线算法。如需详细了解密钥格式,请参阅公钥格式。

生成 RSA 密钥
您可以使用以下命令生成 2048 位 RSA 密钥对:

openssl genpkey -algorithm RSA -out rsa_private.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem

这些命令创建以下公钥/私钥对:

rsa_private.pem:必须安全地存储在设备上并且用于对身份验证 JWT 进行签名的私钥。
rsa_public.pem:必须存储在 Cloud IoT Core 中并且用于验证身份验证 JWT 的签名的公钥。

使用自签名 X.509 证书生成 RSA 密钥
如果您要根据注册表级证书验证密钥,该证书必须满足某些要求。 其中一项要求就是证书使用 X.509 标准。

如需生成 2048 位 RSA 私钥以及具有 SHA-256 签名的自签名 X.509 证书,请运行以下命令:

openssl req -x509 -nodes -newkey rsa:2048 -keyout rsa_private.pem \
    -out rsa_cert.pem -subj "/CN=unused"

您可以将 -subj 参数替换为实际的证书主题并使用该证书,也可以省略 -subj 并在系统提示时提供证书信息。(Cloud IoT Core 不会验证主题。)

默认情况下,X.509 证书会在创建 30 天后过期。如需设置证书到期前的天数,请在创建时添加 -days 标志。如果您尝试使用过期证书创建或更新设备,或者尝试将设备连接到注册表并且注册表的证书已过期,则 Cloud IoT Core 将返回错误。

生成椭圆曲线密钥
您可以使用以下命令生成 P-256 椭圆曲线密钥对:

openssl ecparam -genkey -name prime256v1 -noout -out ec_private.pem
openssl ec -in ec_private.pem -pubout -out ec_public.pem

这些命令创建以下公钥/私钥对:
ec_private.pem:必须安全地存储在设备上并且用于对身份验证 JWT 进行签名的私钥。
ec_public.pem:必须存储在 Cloud IoT Core 中并且用于验证身份验证 JWT 的签名的公钥。

使用自签名 X.509 证书生成 ES256 密钥
如果您要根据注册表级证书验证密钥,该证书必须符合本页面未介绍的一些其他要求。 其中一项要求就是证书使用 X.509 标准。

运行以下命令以使用自签名 X.509 证书生成 ES256 密钥:

openssl req -x509 -new -key ec_private.pem -out ec_cert.pem -subj "/CN=unused"

您可以将 -subj 参数替换为实际证书主题并使用该证书,也可以省略 -subj 并在出现提示时提供证书信息。(Cloud IoT Core 不会验证主题。)

默认情况下,X.509 证书会在创建 30 天后过期。如需设置证书到期前的天数,请在创建时添加 -days 标志。如果您尝试使用过期证书创建或更新设备,或者尝试将设备连接到注册表并且注册表的证书已过期,则 Cloud IoT Core 将返回错误。

将密钥转换为 Java 版 PKCS8
在 Java 中,您需要将私钥转换为 PKCS8 格式。如需将 RSA 和椭圆曲线密钥从 PEM 格式转换为 PKCS8 格式,请运行以下命令:

RSA

openssl pkcs8 -topk8 -inform PEM -outform DER -in rsa_private.pem \
    -nocrypt > rsa_private_pkcs8

椭圆曲线

openssl pkcs8 -topk8 -inform PEM -outform DER -in ec_private.pem \
    -nocrypt > ec_private_pkcs8

自签名证书:

openssl req -newkey rsa:2048 -nodes -keyout web_private.key -x509 -days 365 -out web.crt -subj "/C=CN/ST=sz/L=sz/O=ETN/OU=SI/CN=10.130.212.91"

私有CA签名证书

openssl genrsa -out NMCrootCA.key 2048
openssl req -new -key NMCrootCA.key -out NMCrootCA.csr -subj "/C=CN/ST=SZ/L=SZ/O=ETN/OU=SI/CN=NMCG2"
openssl x509 -req -in NMCrootCA.csr -out NMCrootCA.crt -signkey NMCrootCA.key -days 3650

给设备证书签名:

私钥
openssl genrsa -out device.key 2048
特定IP签名,设备启动自动生成
openssl req -new -key device.key -out device.csr -subj "/C=CN/ST=SZ/L=SZ/O=ETN/OU=SI/CN=10.130.212.91"
生成CA签名过的设备证书
openssl x509 -req -in device.csr -CA NMCrootCA.crt -CAkey NMCrootCA.key -CAcreateserial -out device.crt -days 365