【发布时间】:2019-10-08 14:47:12
【问题描述】:
根据这个docs,我需要为我的物联网设备生成所谓的引导证书。我假设对于引导证书生成 CA 证书将通过 AWS SDK 下载并用于生成引导证书。
我找不到任何或多或少的理智示例来说明如何使用 java AWS SDK 完成此操作。任何人都可以给出我如何做到这一点的代码示例吗?提前致谢。
【问题讨论】:
标签: java aws-sdk iot client-certificates aws-iot
根据这个docs,我需要为我的物联网设备生成所谓的引导证书。我假设对于引导证书生成 CA 证书将通过 AWS SDK 下载并用于生成引导证书。
我找不到任何或多或少的理智示例来说明如何使用 java AWS SDK 完成此操作。任何人都可以给出我如何做到这一点的代码示例吗?提前致谢。
【问题讨论】:
标签: java aws-sdk iot client-certificates aws-iot
我找到了解决方案。 AWS bootstrap 证书是由在 AWS IoT 中注册的 CA 证书签署的证书。请参阅工作流程here。为了在 java 中实现这一点,我使用了 Bouncy Castle 库。 首先,下载 CA 证书和 CA 证书私钥。并为您的引导证书生成密钥对:
KeyPairGenerator keypairGen = KeyPairGenerator.getInstance("RSA");
keypairGen.initialize(2048, random);
KeyPair keypair = keypairGen.generateKeyPair();
PublicKey publicKey = keypair.getPublic();
使用 Bouncy Castle 库将 CA 证书和 CA 私钥转换为 X509Certificate 和 PrivateKey 对象(参见book 中的示例)。生成证书:
public X509Certificate makeV3Certificate(
X509Certificate caCertificate,
PrivateKey caPrivateKey,
PublicKey publicKey)
throws GeneralSecurityException, CertIOException, OperatorCreationException {
X509v3CertificateBuilder v3CertBuilder = new JcaX509v3CertificateBuilder(
caCertificate.getSubjectX500Principal(), // issuer
BigInteger.valueOf(System.currentTimeMillis()) // serial number
.multiply(BigInteger.valueOf(10)),
new Date(System.currentTimeMillis() - 1000 * 5), // start time
new Date(System.currentTimeMillis() + 1000 * 3600 * 3), // expiry time
new X500Principal(String.format("CN=%s", "desirable Common Name")), // subject
publicKey); // subject public key
JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils();
v3CertBuilder.addExtension(
Extension.subjectKeyIdentifier,
false,
extUtils.createSubjectKeyIdentifier(publicKey));
v3CertBuilder.addExtension(
Extension.authorityKeyIdentifier,
false,
extUtils.createAuthorityKeyIdentifier(caCertificate));
v3CertBuilder.addExtension(
Extension.basicConstraints,
true,
new BasicConstraints(false));
JcaContentSignerBuilder signerBuilder = new JcaContentSignerBuilder("SHA256withRSA");
return new JcaX509CertificateConverter().getCertificate(v3CertBuilder.build(signerBuilder.build(caPrivateKey)));
}
使用 Bouncy Castle 库将证书转换为 pem 格式,将 CA 证书附加到 pem 文件。此外,将引导证书私钥(从密钥对获取)转换为 pem 格式。就这些。您可以通过 mqtt 使用此 CA 签名证书和 AWS IoT 的私钥连接您的设备。
【讨论】: