【问题标题】:Create a self-signed certificate in Java for AWS IoT在 Java 中为 AWS IoT 创建自签名证书
【发布时间】:2019-09-10 00:20:33
【问题描述】:

我有一个根 CA 证书及其私钥(CAcert.pem 和 CApvtkey.key)。

根 CA 证书已在 AWS IoT 核心上注册。这将用于自签名和验证其他证书以进行身份​​验证。

我正在尝试使用 Java 创建由我的根 CA 证书签名的证书,但运气不佳。

AWS IoT Java SDK 提供了生成证书以及在 AWS 上注册/激活它们的功能,但我不知道如何使用我的根 CA 证书对它们进行签名并激活它们。

我只有这个:

  //Previous code sets up thing name etc...

  CreateThingResult resp1 = client.createThing(thingRequest);

  CreateKeysAndCertificateRequest req = new CreateKeysAndCertificateRequest();
  req.setSetAsActive(true);
  CreateKeysAndCertificateResult resp2 = client.createKeysAndCertificate(req);

  client.attachThingPrincipal(new AttachThingPrincipalRequest().
            withPrincipal(resp2.getCertificateArn()).withThingName("Java-App_Thing"));

有人知道如何创建由我的 CA 证书签名的证书吗?

【问题讨论】:

  • 您是否考虑过使用其他工具,例如openssl
  • @michalk,我有,并且也在使用 bouncycastle,但是如何在 AWS IoT 云上激活证书?
  • 正如您所说,您拥有 PEM 格式的 CA 私钥和 CA 证书,其中包含证书的公钥。使用这些文件,您可以尝试生成使用 CA 证书签名的证书。 Here 是使用 openssl 执行此操作的示例。基于 CA 密钥和 PEM 生成 CSR 的第二步对您来说最重要。
  • @michalk 。我已经这样做了,谢谢。 (我应该在问题中提到)。我需要在 Java 中完成所有这些,然后在云上注册生成的签名证书。即使在 bash 中执行该部分,生成签名证书也可以,但我仍然找不到任何 Java API 来在 AWS IoT 平台上注册和激活证书。
  • 你知道如何用java中的CA签署证书了吗?

标签: java ssl aws-sdk aws-iot self-signed-certificate


【解决方案1】:

因此,AWS 上的文档非常模糊。我遇到过同样的问题。这是我修复它的方法。假设您向 AWS IoT 注册了 CA, 即使您为上传的 CA 启用自动注册,AWS IoT 也不会允许设备连接。证书将有几个用于 JiT(及时)注册的选项。

  1. 创建 Lamba 以在特定条件下激活设备;
  2. 在 MQTT 上列出事件以激活证书;
  3. 注册公钥。

选项 1 和 2 在 AWS Docs 中进行了描述 https://docs.aws.amazon.com/iot/latest/developerguide/auto-register-device-cert.html

选项 3 的步骤:

  1. 注册事物
software.amazon.awssdk.services.iot.IotClient iotClient = IotClient.create()
//This allows AWS Credentials to be picked up using DefaultAWSCredentialsProviderChain
CreateThingRequest thingToBeCreated =
CreateThingRequest.builder().thingName("Unique Id of Device").build();
iotClient.createThing(thingToBeCreated);
  1. 注册并激活设备的公钥。
RegisterCertificateRequest registerCertificateRequest = RegisterCertificateRequest.builder()
.caCertificatePem("CA Pem as String")
.certificatePem("Device Public Key in Pem as String")
.setAsActive(true)
.build();
final RegisterCertificateResponse registerCertificateResponse = iotClient.registerCertificate(registerCertificateRequest);

  1. 将证书附加到事物上。
AttachThingPrincipalRequest attachThingPrincipalRequest = AttachThingPrincipalRequest.builder()
.thingName("Unique Id of Device")
.principal(registerCertificateResponse.certificateArn())
.build();
iotClient.attachThingPrincipal(attachThingPrincipalRequest);
  1. 可选,将策略附加到事物以便它可以连接。
AttachPolicyRequest attachPolicyRequest = AttachPolicyRequest.builder()
.policyName("policy_that_allow_device_connections")
.target(registerCertificateResponse.certificateArn())
.build();
iotClient.attachPolicy(attachPolicyRequest);

【讨论】:

    【解决方案2】:

    谢谢!!! 以上步骤对我有用,代码需要以下依赖项,

    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>iot</artifactId>
        <version>2.17.121</version>
    </dependency>
    

    此外,我在这里使用了另一个库来执行相同的过程。 步骤是,

    1. 在 AWS IoT 核心中使用验证证书注册 RootCA
    2. 创建事物并附加设备证书和策略以以编程方式连接

    现在详细说一下:

    1. 在 AWS IoT 核心中使用验证证书注册 RootCA

      点击链接 https://docs.aws.amazon.com/iot/latest/developerguide/register-CA-cert.html

    2. 创建事物并附加设备证书和策略以编程方式进行连接

    以下以编程方式执行该过程所需的步骤,

    需要的依赖:

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-iot-device-sdk-java</artifactId>
        <version>1.3.9</version>
    </dependency>
    
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-core</artifactId>
        <version>1.12.150</version>
    </dependency>
    
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-iot</artifactId>
        <version>1.12.150</version>
    </dependency>
    

    Aws 配置类:

    public class AwsConfig {
    
        @Bean
        public AWSIot getIotClient() {
            return AWSIotClientBuilder.standard()
                    .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("users_aws_access_key", "users_aws_secret_key")))
                    .withRegion("users_aws_region").build();
        }   
    }
    

    服务类:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import com.amazonaws.services.iot.model.AttachPolicyRequest;
    import com.amazonaws.services.iot.model.AttachPolicyResult;
    import com.amazonaws.services.iot.model.AttachThingPrincipalRequest;
    import com.amazonaws.services.iot.model.AttachThingPrincipalResult;
    import com.amazonaws.services.iot.model.CertificateStatus;
    import com.amazonaws.services.iot.model.CreateThingRequest;
    import com.amazonaws.services.iot.model.CreateThingResult;
    import com.amazonaws.services.iot.model.DescribeThingRequest;
    import com.amazonaws.services.iot.model.DescribeThingResult;
    import com.amazonaws.services.iot.model.RegisterCertificateRequest;
    import com.amazonaws.services.iot.model.RegisterCertificateResult;
    import com.amazonaws.services.iot.model.ResourceNotFoundException;
    
    @Service
    public class RegisterService {
    
        @Autowired
        private AwsConfig iotClient;
    
        public String RegisterDevice() {
    
            // check if thing Already exists
            if (!describeThing("Unique Id of Device")) {
    
                // Thing Creation
                CreateThingResult response = iotClient.getIotClient()
                        .createThing(new CreateThingRequest().withThingName("Unique Id of Device/Thing"));
    
                // Register and activate the Public Key of the device
                RegisterCertificateResult registerCert = iotClient.getIotClient()
                        .registerCertificate(new RegisterCertificateRequest().withCaCertificatePem("CA Pem as String")
                                .withCertificatePem("Device Public Key in Pem as String").withStatus(CertificateStatus.ACTIVE));
    
                // Attach the Cert to the thing
                AttachThingPrincipalResult attachThingPrincipalResult = iotClient.getIotClient().attachThingPrincipal(
                        new AttachThingPrincipalRequest()
                            .withThingName("Unique Id of Device/Thing").withPrincipal(registerCert.getCertificateArn()));
    
                // Attach policies to the thing so it can connect
                AttachPolicyResult policyResult = iotClient.getIotClient()
                        .attachPolicy(new AttachPolicyRequest()
                            .withPolicyName("policy_that_allow_device_connections").withTarget(registerCert.getCertificateArn()));
    
                return "Thing Created Successfully";
            }   
            
            // Thing exists
            return "Thing Already Exists on IoT Console";
        }
    
        private boolean describeThing(String thingName) {
            if (thingName == null) {
                return false;
            }
            try {
                describeThingResponse(thingName);
                return true;
            } catch (ResourceNotFoundException e) {
                // e.printStackTrace();
                return false;
            }
        }
    
        private DescribeThingResult describeThingResponse(String thingName) {
            DescribeThingRequest describeThingRequest = new DescribeThingRequest();
            describeThingRequest.setThingName(thingName);
            return iotClient.getIotClient().describeThing(describeThingRequest);
        }
        
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2011-12-31
      • 2019-11-07
      • 2014-02-15
      相关资源
      最近更新 更多