

지원 종료 공지: 2026년 10월 7일에는에 대한 지원을 중단할 AWS 예정입니다 AWS IoT Greengrass Version 1. 2026년 10월 7일 이후에는 더 이상 AWS IoT Greengrass V1 리소스에 액세스할 수 없습니다. 자세한 내용은 [에서 마이그레이션 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)을 참조하세요.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 모듈 7: 하드웨어 보안 통합 시뮬레이션
<a name="console-mod7"></a>

이 기능은 AWS IoT Greengrass 코어 v1.7 이상에서 사용할 수 있습니다.

이 고급 모듈에서는 Greengrass 코어와 함께 사용하도록 시뮬레이션된 하드웨어 보안 모듈(HSM)을 구성하는 방법을 보여줍니다. 이 구성에서 사용되는 SoftHSM은 [PKCS\$111](#console-mod7-see-also) 애플리케이션 프로그래밍 인터페이스(API)를 사용하는 일반 소프트웨어 구현입니다. 이 모듈의 목적은 PKCS\$111 API의 소프트웨어 전용 구현을 배우고 초기 테스트를 수행할 수 있는 환경을 설정하도록 하는 것입니다. 이 모듈은 학습과 초기 테스트를 위해서만 제공되지 어떠한 종류의 실제 사용 용도로도 제공되지 않습니다.

이 구성을 통해 PKCS\$111 호환 서비스를 사용하여 프라이빗 키를 저장하는 실험을 할 수 있습니다. 소프트웨어전용 구현에 대한 자세한 내용은 [SoftHSM](https://www.opendnssec.org/softhsm/)을 참조하십시오. 일반 요구 사항을 포함하여 AWS IoT Greengrass 코어에 하드웨어 보안을 통합하는 방법에 대한 자세한 내용은 섹션을 참조하세요[하드웨어 보안 통합](hardware-security.md).

**중요**  
이 모듈은 실험 전용으로만 제공됩니다. 잘못된 보안 감지가 늘어날 수 있기 때문에 프로덕션 환경에서는 SoftHSM을 사용하지 않는 것이 좋습니다. 이러한 구성은 실제 보안 이점을 전혀 제공하지 않습니다. SoftHSM에 저장되는 키는 Greengrass 환경에서 보안 암호를 저장하는 다른 수단보다 안전하게 저장되지 않습니다.  
이 모듈의 목적은 앞으로 실제 하드웨어 기반 HSM을 사용할 계획이 있는 경우 PKCS\$111 사양에 대해 배우고 소프트웨어의 초기 테스트를 수행할 수 있도록 하는 것입니다.  
SoftHSM에서 제공하는 PKCS\$111 구현과 하드웨어 기반 구현에는 차이가 있을 수 있기 때문에 프로덕션 사용 전에 향후 하드웨어 구현을 별도로 철저하게 테스트해야 합니다.

[지원되는 하드웨어 보안 모듈의](hardware-security.md#hardware-security-reqs) 온보딩에 도움이 필요한 경우 AWS Enterprise Support 담당자에게 문의하세요.

시작하기 전에 [Greengrass 장치 설정](quick-start.md) 스크립트를 실행하거나 시작하기 자습서의 [모듈 1](module1.md) 및 [모듈 2](module2.md)를 완료했는지 확인합니다. 이 모듈에서는 코어가 이미 프로비저닝되어 있고와 통신한다고 가정합니다 AWS. 이 모듈을 완료하는 데 약 30분 정도 걸립니다.

## SoftHSM 소프트웨어 설치
<a name="softhsm-install"></a>

이 단계에서는 SoftHSM을 설치하고, SoftHSM 인스턴스를 관리하는 데 사용되는 pkcs11 도구를 설치합니다.
+  AWS IoT Greengrass 코어 디바이스의 터미널에서 다음 명령을 실행합니다.

  ```
  sudo apt-get install softhsm2 libsofthsm2-dev pkcs11-dump
  ```

  이러한 패키지에 대한 자세한 내용은 [Install softhsm2](https://www.howtoinstall.co/en/ubuntu/xenial/softhsm2), [Install libsofthsm2-dev](https://www.howtoinstall.co/en/ubuntu/xenial/libsofthsm2-dev) 및 [Install pkcs11-dump](https://www.howtoinstall.co/en/ubuntu/xenial/pkcs11-dump)를 참조하십시오.
**참고**  
시스템에서 이 명령을 사용할 때 문제가 발생하면 GitHub에서 [SoftHSM 버전 2](https://github.com/opendnssec/SoftHSMv2)를 참조하십시오. 이 사이트에서는 소스에서 빌드하는 방법을 비롯하여 설치 정보를 더욱 다양하게 제공합니다.

## SoftHSM 구성
<a name="softhsm-config"></a>

이 단계에서는 [SoftHSM을 구성](https://github.com/opendnssec/SoftHSMv2#configure-1)합니다.

1. 루트 사용자로 전환합니다.

   ```
   sudo su
   ```

1. 매뉴얼 페이지를 사용하여 시스템 전체에서 `softhsm2.conf` 위치를 찾습니다. 공통 위치는 `/etc/softhsm/softhsm2.conf`이며, 일부 시스템에서는 이 위치가 다를 수 있습니다.

   ```
   man softhsm2.conf
   ```

1. 시스템 전체 위치에서 softhsm2 구성 파일의 디렉터리를 생성합니다. 이 예에서는 위치가 `/etc/softhsm/softhsm2.conf`라고 가정합니다.

   ```
   mkdir -p /etc/softhsm
   ```

1. `/greengrass` 디렉터리에서 토큰 디렉터리를 생성합니다.
**참고**  
이 단계를 건너뛰면 softhsm2-util에서 `ERROR: Could not initialize the library`를 보고합니다.

   ```
   mkdir -p /greengrass/softhsm2/tokens
   ```

1. 토큰 디렉터리를 구성합니다.

   ```
   echo "directories.tokendir = /greengrass/softhsm2/tokens" > /etc/softhsm/softhsm2.conf
   ```

1. 파일 기반 백엔드를 구성합니다.

   ```
   echo "objectstore.backend = file" >> /etc/softhsm/softhsm2.conf
   ```

**참고**  
이러한 구성 설정은 실험 전용입니다. 모든 구성 옵션을 보려면 해당 구성 파일의 매뉴얼 페이지를 읽어보십시오.  

```
man softhsm2.conf
```

## SoftHSM으로 프라이빗 키 가져오기
<a name="softhsm-import-key"></a>

이 단계에서는 SoftHSM 토큰을 초기화하고, 프라이빗 키 형식을 변환한 다음 프라이빗 키를 가져옵니다.

1. SoftHSM 토큰을 초기화합니다.

   ```
   softhsm2-util --init-token --slot 0 --label greengrass --so-pin 12345 --pin 1234
   ```
**참고**  
메시지가 표시되면 SO 핀(`12345`)과 사용자 핀(`1234`)을 입력합니다. AWS IoT Greengrass 에서는 SO(감독자) 핀을 사용하지 않으므로 임의의 값을 사용할 수 있습니다.  
`CKR_SLOT_ID_INVALID: Slot 0 does not exist` 오류가 발생하면 다음 명령을 대신 시도하십시오.  

   ```
   softhsm2-util --init-token --free --label greengrass --so-pin 12345 --pin 1234
   ```

1. 프라이빗 키를 SoftHSM 가져오기 도구에서 사용할 수 있는 형식으로 변환합니다. 이 튜토리얼에서는 시작하기 튜토리얼의 [모듈 2](module2.md)에 있는 **기본 그룹 생성** 옵션에서 얻은 개인 키를 변환합니다.

   ```
   openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in hash.private.key -out hash.private.pem
   ```

1. SoftHSM으로 프라이빗 키를 가져옵니다. softhsm2-util 버전에 따라 다음 명령 중 하나만 실행합니다.  
**Raspbian softhsm2-util v2.2.0** 구문  

   ```
   softhsm2-util --import hash.private.pem --token greengrass --label iotkey --id 0000 --pin 12340
   ```  
**Ubuntu softhsm2-util v2.0.0** 구문  

   ```
   softhsm2-util --import hash.private.pem --slot 0 --label iotkey --id 0000 --pin 1234
   ```

   이 명령은 슬롯을 `0`으로 식별하고, 키 레이블을 `iotkey`로 정의합니다. 이러한 값은 다음 섹션에서 사용합니다.

프라이빗 키를 가져온 다음에는 `/greengrass/certs` 디렉터리에서 선택적으로 제거할 수 있습니다. 루트 CA 및 장치 인증서는 이 디렉터리에 보관합니다.

## SoftHSM을 사용하도록 Greengrass 코어 구성
<a name="softhsm-config-core"></a>

이 단계에서는 SoftHSM을 사용하도록 Greengrass 코어 구성 파일을 수정합니다.

1. 시스템에서 SoftHSM 공급자 라이브러리(`libsofthsm2.so`) 경로를 찾습니다.

   1. 이 라이브러리에 대해 설치된 패키지 목록을 가져옵니다.

      ```
      sudo dpkg -L libsofthsm2
      ```

      `libsofthsm2.so` 파일은 `softhsm` 디렉터리에 있습니다.

   1. 파일의 전체 경로를 복사합니다(예: `/usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so`). 이 값은 나중에 사용합니다.

1. Greengrass 데몬을 중지합니다.

   ```
   cd /greengrass/ggc/core/
   sudo ./greengrassd stop
   ```

1. Greengrass 구성 파일을 엽니다. [`config.json`](gg-core.md#config-json) 파일은 `/greengrass/config` 디렉터리에 있습니다.
**참고**  
이 절차의 예제는 `config.json` 파일이 시작하기 튜토리얼의 [모듈 2](module2.md)에 있는 **기본 그룹 생성** 옵션에서 생성된 형식을 사용한다는 가정 하에 작성되었습니다.

1. `crypto.principals` 객체에서 다음 MQTT 서버 인증서 객체를 삽입합니다. 유효한 JSON 파일을 생성하는 데 필요한 경우 쉼표를 추가합니다.

   ```
     "MQTTServerCertificate": {
       "privateKeyPath": "path-to-private-key"
     }
   ```

1. `crypto` 객체에서 다음 `PKCS11` 객체를 삽입합니다. 유효한 JSON 파일을 생성하는 데 필요한 경우 쉼표를 추가합니다.

   ```
     "PKCS11": {
       "P11Provider": "/path-to-pkcs11-provider-so",
       "slotLabel": "crypto-token-name",
       "slotUserPin": "crypto-token-user-pin"
     }
   ```

   파일은 다음과 같아야 합니다.

   ```
   {
     "coreThing" : {
       "caPath" : "root.ca.pem",
       "certPath" : "hash.cert.pem",
       "keyPath" : "hash.private.key",
       "thingArn" : "arn:partition:iot:region:account-id:thing/core-thing-name",
       "iotHost" : "host-prefix.iot.region.amazonaws.com",
       "ggHost" : "greengrass.iot.region.amazonaws.com",
       "keepAlive" : 600
     },
     "runtime" : {
       "cgroup" : {
         "useSystemd" : "yes"
       }
     },
     "managedRespawn" : false,
     "crypto": {
       "PKCS11": {
         "P11Provider": "/path-to-pkcs11-provider-so",
         "slotLabel": "crypto-token-name",
         "slotUserPin": "crypto-token-user-pin"
       },
       "principals" : {
         "MQTTServerCertificate": {
           "privateKeyPath": "path-to-private-key"
         },
         "IoTCertificate" : {
           "privateKeyPath" : "file:///greengrass/certs/hash.private.key",
           "certificatePath" : "file:///greengrass/certs/hash.cert.pem"
         },
         "SecretsManager" : {
           "privateKeyPath" : "file:///greengrass/certs/hash.private.key"
         }
       },    
       "caPath" : "file:///greengrass/certs/root.ca.pem"
     }
   }
   ```
**참고**  
하드웨어 보안에 무선(OTA) 업데이트를 사용하려면 `PKCS11` 개체에도 `OpenSSLEngine` 속성이 포함되어야 합니다. 자세한 내용은 [무선 업데이트에 대한 지원 구성](hardware-security.md#hardware-security-ota-updates) 단원을 참조하십시오.

1. 다음과 같이 `crypto` 객체를 편집합니다.

   1. `PKCS11` 객체를 구성합니다.
      + `P11Provider`에 `libsofthsm2.so`의 전체 경로를 입력합니다.
      + `slotLabel`에 `greengrass`를 입력합니다.
      + `slotUserPin`에 `1234`를 입력합니다.

   1. `principals` 객체에 프라이빗 키 경로를 구성합니다. `certificatePath` 속성은 편집하지 마십시오.
      + `privateKeyPath` 속성에 다음 RFC 7512 PKCS\$111 경로(키의 레이블을 지정하는 경로)를 입력합니다. `IoTCertificate`, `SecretsManager` 및 `MQTTServerCertificate` 보안 주체에 대해 동일하게 수행합니다.

        ```
        pkcs11:object=iotkey;type=private
        ```

   1. `crypto` 객체를 확인합니다. 예를 들면 다음과 같아야 합니다.

      ```
        "crypto": {
          "PKCS11": {
            "P11Provider": "/usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so",
            "slotLabel": "greengrass",
            "slotUserPin": "1234"
          },
          "principals": {
            "MQTTServerCertificate": {
              "privateKeyPath": "pkcs11:object=iotkey;type=private"
            },
            "SecretsManager": {
              "privateKeyPath": "pkcs11:object=iotkey;type=private"
            },
            "IoTCertificate": {
              "certificatePath": "file://certs/core.crt",
              "privateKeyPath": "pkcs11:object=iotkey;type=private"
            }
          },
          "caPath": "file://certs/root.ca.pem"
        }
      ```

1. `coreThing` 객체에서 `caPath`, `certPath` 및 `keyPath` 값을 제거합니다. 예를 들면 다음과 같아야 합니다.

   ```
   "coreThing" : {
     "thingArn" : "arn:partition:iot:region:account-id:thing/core-thing-name",
     "iotHost" : "host-prefix-ats.iot.region.amazonaws.com",
     "ggHost" : "greengrass-ats.iot.region.amazonaws.com",
     "keepAlive" : 600
   }
   ```

**참고**  
이 자습서에서는 모든 보안 주체에 대해 동일한 프라이빗 키를 지정합니다. 로컬 MQTT 서버에 대한 프라이빗 키 선택에 대한 자세한 내용은 [성능](hardware-security.md#hsm-performance)을 참조하십시오. 로컬 보안 암호 관리자에 대한 자세한 내용은 [AWS IoT Greengrass 코어에 보안 암호 배포](secrets.md) 단원을 참조하십시오.

## 구성 테스트
<a name="softhsm-test"></a>
+ Greengrass 데몬을 시작합니다.

  ```
  cd /greengrass/ggc/core/
  sudo ./greengrassd start
  ```

  데몬이 성공적으로 시작하면 코어가 제대로 구성된 것입니다.

  이제 PKCS\$111 사양에 대해 배우고 SoftHSM 구현에서 제공하는 PKCS\$111 API를 사용해 초기 테스트를 수행할 준비가 되었습니다.
**중요**  
다시 말하지만, 이 모듈은 학습 및 테스트만을 위한 모듈입니다. 이 모듈이 Greengrass 환경의 보안 상태를 실제로 강화하지는 않습니다.  
대신 이 모듈의 용도는 앞으로 실제 하드웨어 기반 HSM을 사용할 것에 대비해 학습 및 테스트를 시작하도록 하는 데 있습니다. 현재, SoftHSM에서 제공하는 PKCS\$111 구현과 하드웨어 기반 구현 사이에는 차이가 있을 수 있으므로 실제 사용 전에 하드웨어 기반 HSM에 대해 소프트웨어를 별도로 철저하게 테스트해야 합니다.

## 다음 사항도 참조하세요.
<a name="console-mod7-see-also"></a>
+ *PKCS \$111 암호화 토큰 인터페이스 사용 설명서 버전 2.40*. John Leiseboer 및 Robert Griffin 편집. 2014년 11월 16일 OASIS Committee Note 02. [ http://docs.oasis-open.org/pkcs11/pkcs11-ug/v2.40/cn02/pkcs11-ug-v2.40-cn02.html](http://docs.oasis-open.org/pkcs11/pkcs11-ug/v2.40/cn02/pkcs11-ug-v2.40-cn02.html). 최신 버전: [ http://docs.oasis-open.org/pkcs11/pkcs11-ug/v2.40/pkcs11-ug-v2.40.html](http://docs.oasis-open.org/pkcs11/pkcs11-ug/v2.40/pkcs11-ug-v2.40.html).
+ [RFC 7512](https://tools.ietf.org/html/rfc7512)