この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
秘密鍵の管理どうしようかな
こんにちは、のんピ(@non____97)です。
皆さんは秘密鍵の管理をどうしようかなと思ったことはありますか? 私はあります。
IAM Roles Anywhereを使うにあたって秘密鍵の管理が重要になります。
...ということで、AWSの最強の鍵管理マネージドサービスであるAWS CloudHSMを使ってみようと思います。
CloudHSMのユースケースにも秘密鍵の管理が例として紹介されています。
** 発行認証局 (CA) 向けのプライベートキーの保護 ** 公開鍵基盤 (PKI) では、認証局 (CA) がデジタル認証を発行する信頼されたエンティティです。このようなデジタル認証は、個人または組織を識別するために使用されます。AWS CloudHSM を使用すると、プライベートキーを保存し、自社の認証を発行する発行 CA として安全に機能することができるよう、認証リクエストに署名することができます。
今回は、実際にAWS公式ドキュメントに沿って秘密鍵をAWS CloudHSMにインポートとエクスポートしてみます。
CloudHSMの作成
クラスターの作成
まず、CloudHSMのクラスターを作成します。
CloudHSMのコンソールからクラスターの作成
をクリックします。
VPCとサブネットを指定して、続行
をクリックします。
バックアップは保持期間は7日にして、続行
をクリックします。
Nameタグを設定して確認
をクリックします。
設定内容を確認してクラスターの作成
をクリックします。
クラスターの作成が開始すると状態がCreate in progress
になります。
5分ほど待つとクラスターの状態がUninitialized
になります。
HSMの作成
次にHSMの作成をします。
作成したクラスターを選択してアクション
-初期化
をクリックします。
HSMのサブネットを選択して作成
をクリックします。
最初の HSM は、[クラスターID] で作成中です
とメッセージが表示されるので、10分弱待ちます。
HSMの作成が完了するとCSRや各種証明書をダウンロードするように促されます。
移行の作業はEC2インスタンスから行います。
クラスターの初期化
クラスターの初期化を行います。
まず、Amazon Linux 2のEC2インスタンスからCSRをダウンロードします。各種証明書はクラスターの初期化に必要ありませんが勢いでダウンロードしました。
# クラスターの情報の確認
$ aws cloudhsmv2 describe-clusters --region us-east-1
{
"Clusters": [
{
"CreateTimestamp": 1657686168.881,
"HsmType": "hsm1.medium",
"BackupPolicy": "DEFAULT",
"SubnetMapping": {
"us-east-1b": "subnet-0355def964cb72d89",
"us-east-1a": "subnet-00b2246e7a23ec379"
},
"ClusterId": "cluster-ieh7u5cvyuq",
"SecurityGroup": "sg-08ffee5d82ec89edf",
"VpcId": "vpc-0e0796981cea634c1",
"State": "UNINITIALIZED",
"Hsms": [
{
"StateMessage": "HSM created.",
"AvailabilityZone": "us-east-1a",
"EniId": "eni-00b552867cd5de7db",
"HsmId": "hsm-55zvxfeyecy",
"ClusterId": "cluster-ieh7u5cvyuq",
"EniIp": "172.31.40.54",
"State": "ACTIVE",
"SubnetId": "subnet-00b2246e7a23ec379"
}
],
"Certificates": {
"ClusterCsr": "-----BEGIN CERTIFICATE REQUEST-----\nMIIC0DCCAbgCAQAwgYoxRDAJBgNVBAYTAlVTMAkGA1UECAwCQ0EwDQYDVQQKDAZD\nYXZpdW0wDQYDVQQLDAZOM0ZJUFMwDgYDVQQHDAdTYW5Kb3NlMUIwQAYDVQQDDDlI\nU006RTZFRTk5N0FFNkFFOTYyQjdGN0IxMTlENTNGRjk1OlBBUlROOjksIGZvciBG\nSVBTIG1vZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdXxLf4CzO\naTYCOzjLk9AK72E4doAJRtJRdkUEFF6cYML612zh9IrC9qYbBYbVtOxbv2b0Alr6\nyVq5A1xHYRE3la3Wnn6OMtJ308tka3xnc1gbZby5AmbsQ66P6F8gfF5YPuMgbWq7\n27rjHxXt9v3QnT9L4HN270Qd6HqL35DvlHOKrseCu51nkk0MKQkx8znt/2ve00wC\nCIJznKU5q29vXiVIInjy10SGRnxXt8RjymiLI+Etd8fqM7mZVbfwwqgBhwUOhcMi\nUt2MH6Dwyw4a5x+2SU5CoVmFSPT8FziECJOlH4rbHZmPGBhlp1SwL36Vfk4Auxx3\nivj2061IEL9pAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAnPn/SvpS53jL8ek9\nDwyBG02yEAhxaSJeY+50hg+C8mEa7ECBn7CnFukn8rD0M4Tem1klaOem3X/7r9w4\nvCzWN0DJ1MPnT/Qh+i/3Lc4y/0/GZPd5nJrNshBUVos5MvQ4DGPMdtTc8ncKKFFo\nfItB48+6lGyv+Q8mcZRcbbdbS5X10sOKY2wQ3aKFOP5uqaeEDV9LtyAYxTu+kK8I\n5bFpykJ00AzzLGkD1PESu4s8WmEp7YNmm6qKrj6rnR9Paz99nGg4lVWNZXGCZoSe\n2QHtwi9wtyri/Ha4CEY/xjFxNjL4M0hcxFx/pjNbtw/pfyu7T1QMIgf1UO/lJUYx\nkHoBRw==\n-----END CERTIFICATE REQUEST-----\n",
"AwsHardwareCertificate": "-----BEGIN CERTIFICATE-----\nMIIDozCCAougAwIBAgIFAONpW/QwDQYJKoZIhvcNAQELBQAwgYcxCzAJBgNVBAYT\nAlVTMREwDwYDVQQIDAhWaXJnaW5pYTEQMA4GA1UEBwwHSGVybmRvbjEhMB8GA1UE\nCgwYQW1hem9uIFdlYiBTZXJ2aWNlcyBJTkMuMREwDwYDVQQLDAhDbG91ZEhTTTEd\nMBsGA1UEAwwUQVdTIENsb3VkSFNNIFJvb3QgRzEwHhcNMTkxMjAyMTA0NzIzWhcN\nMjkxMTI5MTA0NzIzWjB2MUQwCQYDVQQGEwJVUzAJBgNVBAgMAkNBMA0GA1UECgwG\nQ2F2aXVtMA0GA1UECwwGTjNGSVBTMA4GA1UEBwwHU2FuSm9zZTEuMCwGA1UEAwwl\nSFNNOjUuMkcxOTE3LUlDTTAwMDQ1NiwgZm9yIEZJUFMgbW9kZTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAKbYKpM3TitmNauI2vV1QsfaE7lDhTkHqdNs\n55j6xxbYQVJpU+fNHT1IKFTXUJUSwwxpHcgPozvisYCeBb5Qw/YvlthhtgkHhb/q\njphvFYHOzIbSV519Vh8eWZ7keiopxbqQzCRfxJKqK8uiSKh53UMhg3P7btQEhdjc\nydlI4CEXbBz12AMycyRFUxnopQJksWRJU5ZSGWIRp9e3bcqMTbmw5D/4jH0vkxXg\nmyT8kFjdMu8fxckpN2Fg4MJnjkWqrrrK4nSg6Xo4ntPwQKT+xbdXM9g9jTNck4ah\nJVbQvok1SrrTFPeT4U9W9m4oVa3hLQU7UhaalqUwB0jBD7ktGv0CAwEAAaMmMCQw\nDgYDVR0PAQH/BAQDAgIEMBIGA1UdEwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcNAQEL\nBQADggEBADJfBWkNidTg+h2eo0bTtW4hHHKMuJKxsXH1hQZI0yY1EWVFr+NHr2OE\nAQ6QTpihrxTyFX7oElz2IL1zYQYqCKEI4xyww/dgKL+5GnXkR1Tzh7ySKahscYON\nuMShzqIdXtlqy/12sOTxLXDewCxOqwvU4Bk11WyK6wgR1J1Ppvuwf3tmPuJgB8zp\n4I04/xo3Vh+1AfMJ3h0HmNaBIBc+Ox8z4pJAPFucZaxXm73nPPuZvDtDwcUcwXcU\npMk9oNWzIJnggjeF6PULzWR6MW/+5tX+KEHkGn97CpOumN9KVTmAVrkpDFdcnc7+\n4LcRYJzcfz5JXsXiVTE790lzwI1cffk=\n-----END CERTIFICATE-----\n",
"ManufacturerHardwareCertificate": "-----BEGIN CERTIFICATE-----\nMIIDqTCCApGgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBkTELMAkGA1UEBhMCVVMx\nEzARBgNVBAgMCkNhbGlmb3JuaWExETAPBgNVBAcMCFNhbiBKb3NlMRUwEwYDVQQK\nDAxDYXZpdW0sIEluYy4xFzAVBgNVBAsMDkxpcXVpZFNlY3VyaXR5MSowKAYDVQQD\nDCFsb2NhbGNhLmxpcXVpZHNlY3VyaXR5LmNhdml1bS5jb20wHhcNMTkwNzIyMTcz\nODE3WhcNMjkwNzE5MTczODE3WjB2MUQwCQYDVQQGEwJVUzAJBgNVBAgMAkNBMA0G\nA1UECgwGQ2F2aXVtMA0GA1UECwwGTjNGSVBTMA4GA1UEBwwHU2FuSm9zZTEuMCwG\nA1UEAwwlSFNNOjUuMkcxOTE3LUlDTTAwMDQ1NiwgZm9yIEZJUFMgbW9kZTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbYKpM3TitmNauI2vV1QsfaE7lD\nhTkHqdNs55j6xxbYQVJpU+fNHT1IKFTXUJUSwwxpHcgPozvisYCeBb5Qw/Yvlthh\ntgkHhb/qjphvFYHOzIbSV519Vh8eWZ7keiopxbqQzCRfxJKqK8uiSKh53UMhg3P7\nbtQEhdjcydlI4CEXbBz12AMycyRFUxnopQJksWRJU5ZSGWIRp9e3bcqMTbmw5D/4\njH0vkxXgmyT8kFjdMu8fxckpN2Fg4MJnjkWqrrrK4nSg6Xo4ntPwQKT+xbdXM9g9\njTNck4ahJVbQvok1SrrTFPeT4U9W9m4oVa3hLQU7UhaalqUwB0jBD7ktGv0CAwEA\nAaMmMCQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAgQwDQYJKoZI\nhvcNAQELBQADggEBAGMlNJ2a2rEscGEmtFnMnV3a9GBQWGqI0uGZOXNvxMAektjr\naleFe96azvOsyjfc8/hXk93dw2ACl8lqUsp+UaB9iSiAHMLfE0nznO3MU1pu5QWT\niRUTsXDvQX3PWhiCUW8RJq8uOSjfy46l8nJUa9rm3k5rw10fvEJcepmtj698ZG/I\nILiugByFzHvLMiSgFe2teGuIlg5fjFXX9Vwzh8rGLIWXYH4aO0QHz7b+FZw1NLnS\n6lUuwR/qbwsSdIMUiGTOP4Lv/Pt6GXws4ndDrac8U/qfQBvJ8LS7yxMOuKZJ065V\nhiRPoGHX5FV81jLDEgOoRHQSymG0/QmyNiZ/NbA=\n-----END CERTIFICATE-----\n",
"HsmCertificate": "-----BEGIN CERTIFICATE-----\nMIIDejCCAmKgAwIBAgIBCTANBgkqhkiG9w0BAQsFADB2MUQwCQYDVQQGEwJVUzAJ\nBgNVBAgMAkNBMA0GA1UECgwGQ2F2aXVtMA0GA1UECwwGTjNGSVBTMA4GA1UEBwwH\nU2FuSm9zZTEuMCwGA1UEAwwlSFNNOjUuMkcxOTE3LUlDTTAwMDQ1NiwgZm9yIEZJ\nUFMgbW9kZTAeFw0yMjA3MTMwNDMyNDhaFw0zMjA3MTAwNDMyNDhaMIGKMUQwCQYD\nVQQGEwJVUzAJBgNVBAgMAkNBMA0GA1UECgwGQ2F2aXVtMA0GA1UECwwGTjNGSVBT\nMA4GA1UEBwwHU2FuSm9zZTFCMEAGA1UEAww5SFNNOkU2RUU5OTdBRTZBRTk2MkI3\nRjdCMTE5RDUzRkY5NTpQQVJUTjo5LCBmb3IgRklQUyBtb2RlMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnV8S3+Aszmk2Ajs4y5PQCu9hOHaACUbSUXZF\nBBRenGDC+tds4fSKwvamGwWG1bTsW79m9AJa+slauQNcR2ERN5Wt1p5+jjLSd9PL\nZGt8Z3NYG2W8uQJm7EOuj+hfIHxeWD7jIG1qu9u64x8V7fb90J0/S+Bzdu9EHeh6\ni9+Q75Rziq7HgrudZ5JNDCkJMfM57f9r3tNMAgiCc5ylOatvb14lSCJ48tdEhkZ8\nV7fEY8poiyPhLXfH6jO5mVW38MKoAYcFDoXDIlLdjB+g8MsOGucftklOQqFZhUj0\n/Bc4hAiTpR+K2x2ZjxgYZadUsC9+lX5OALscd4r49tOtSBC/aQIDAQABMA0GCSqG\nSIb3DQEBCwUAA4IBAQBxPapwvFDlH+geZmy2AicLPlMuAlfVt4p/TBqrpXbtqnAM\njjKHqWL1V4T/Y4hM4Yz8CGaz1nmc4QIaXSqnvOhqdJWVbcFAaCwpbgeCJzSIvEy/\ncwVFM/LJxeUYYMt57DHp2CSiMvdn3s9kunHbE/tBuVO8CZWJ8zznRk34a5DvRiwn\nBPBqQqS4nMypKat43Mio724yNEIX6HJ4BN3jrFkmzCVZjk76ywrcuCYRY/Yq35C7\nq/fkT1fvReeGttYlLRgUbaV7xBm3GDx95EwZOPVYSx551YqsDQKZfjZwMHRKmi8l\n/cg6APqOpZ7FUy2OQ0boby8/GVidhlE8f5xqKFBX\n-----END CERTIFICATE-----\n"
},
"TagList": [
{
"Value": "iam-roles-anywhere-cloudhsm-cluster",
"Key": "Name"
}
]
}
]
}
# クラスターIDの取得
$ cluster_id=$(aws cloudhsmv2 describe-clusters \
--query 'Clusters[].ClusterId' \
--output text \
--region us-east-1
)
# クラスターIDの表示
$ echo "$cluster_id"
cluster-ieh7u5cvyuq
# CSRファイルの作成
$ aws cloudhsmv2 describe-clusters \
--filters clusterIds="$cluster_id" \
--output text \
--query 'Clusters[].Certificates.ClusterCsr' \
--region us-east-1 \
> "$cluster_id"_ClusterCsr.csr
# HSM証明書ファイルの作成
$ aws cloudhsmv2 describe-clusters \
--filters clusterIds="$cluster_id" \
--output text \
--query 'Clusters[].Certificates.HsmCertificate' \
--region us-east-1 \
> "$cluster_id"_HsmCertificate.crt
# AWSハードウェア証明書ファイルの作成
$ aws cloudhsmv2 describe-clusters \
--filters clusterIds="$cluster_id" \
--output text \
--query 'Clusters[].Certificates.AwsHardwareCertificate' \
--region us-east-1 \
> "$cluster_id"_AwsHardwareCertificate.crt
# 製造元のハードウェア証明書ファイルの作成
$ aws cloudhsmv2 describe-clusters \
--filters clusterIds="$cluster_id" \
--output text \
--query 'Clusters[].Certificates.ManufacturerHardwareCertificate' \
--region us-east-1 \
> "$cluster_id"_ManufacturerHardwareCertificate.crt
# CSRと各種証明書のファイルが作成されたか確認
$ ls -l "$cluster_id"*
-rw-r--r-- 1 ssm-user ssm-user 1323 Jul 13 04:50 cluster-ieh7u5cvyuq_AwsHardwareCertificate.crt
-rw-r--r-- 1 ssm-user ssm-user 1055 Jul 13 04:50 cluster-ieh7u5cvyuq_ClusterCsr.csr
-rw-r--r-- 1 ssm-user ssm-user 1266 Jul 13 04:50 cluster-ieh7u5cvyuq_HsmCertificate.crt
-rw-r--r-- 1 ssm-user ssm-user 1331 Jul 13 04:50 cluster-ieh7u5cvyuq_ManufacturerHardwareCertificate.crt
次に、CA証明書の発行に使用する秘密鍵を作成します。
# CA証明書の発行に使用する秘密鍵を作成
$ openssl genrsa -aes256 -out customerCA.key 2048
Generating RSA private key, 2048 bit long modulus
..+++
..........+++
e is 65537 (0x10001)
Enter pass phrase for customerCA.key:
Verifying - Enter pass phrase for customerCA.key:
# CA証明書の発行に使用する秘密鍵の確認
$ cat customerCA.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,8C8E8A81DA409CCC22E383AFD278C9DE
.
.
(中略)
.
.
-----END RSA PRIVATE KEY-----
次に、CA証明書を発行します。作成したCA証明書をIAM Roles Anywhereの信頼アンカーに登録する場合は、/etc/pki/tls/openssl.cnf
のv3_ca
セクションのkeyUsage
を編集します。
# /etc/pki/tls/openssl.cnf の編集
$ sudo vi /etc/pki/tls/openssl.cnf
# 編集内容の確認
$ cat /etc/pki/tls/openssl.cnf
.
.
(中略)
.
.
[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
# This is what PKIX recommends but some broken software chokes on critical
# extensions.
#basicConstraints = critical,CA:true
# So we do this instead.
basicConstraints = CA:true
# Key usage: this is typical for a CA certificate. However since it will
# prevent it being used as an test self-signed certificate it is best
# left out by default.
keyUsage = cRLSign, keyCertSign, digitalSignature
# Some might want this also
# nsCertType = sslCA, emailCA
# Include email address in subject alt name: another PKIX recommendation
# subjectAltName=email:copy
# Copy issuer details
# issuerAltName=issuer:copy
# DER hex encoding of an extension: beware experts only!
# obj=DER:02:03
# Where 'obj' is a standard or added object
# You can even override a supported extension:
# basicConstraints= critical, DER:30:03:01:01:FF
CA証明書を発行します。
# CA証明書の発行
$ openssl req -new -x509 -days 7 -key customerCA.key -out customerCA.crt
Enter pass phrase for customerCA.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:iam-roles-anywhere-ca
Email Address []:
# CA証明書の確認
$ cat customerCA.crt
-----BEGIN CERTIFICATE-----
MIIDxDCCAqygAwIBAgIJAK01tFvzwG7qMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNV
BAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRww
GgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMR4wHAYDVQQDDBVpYW0tcm9sZXMt
.
.
(中略)
.
.
S/lTQW7NE8vk3J/Tkwn9EGZngwA0I041cl+k1MwdLREo6Ej+HhTVQQXqU7XxFXsS
I3E/V2AlYgmBal85CFHt5nJdwKlqUIhzjNA4hZKvu8N0M/wxshNlSe5Tmh03xgR+
/7L86BUcE/GY3Od8L7gFhlUN6wbddQyhfawf45AJQTJzClgawIOHEL7x1XTKj67o
jjRuiBs71NI=
-----END CERTIFICATE-----
# CA証明書の署名を確認
$ openssl x509 -text -noout -in customerCA.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
ad:35:b4:5b:f3:c0:6e:ea
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Tokyo, L=Default City, O=Default Company Ltd, CN=iam-roles-anywhere-ca
Validity
Not Before: Jul 13 05:04:46 2022 GMT
Not After : Jul 20 05:04:46 2022 GMT
Subject: C=JP, ST=Tokyo, L=Default City, O=Default Company Ltd, CN=iam-roles-anywhere-ca
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:bd:1d:39:66:2a:a6:57:03:e4:64:71:f3:1a:b5:
3f:aa:13:e4:37:c7:84:3c:62:aa:ca:50:c2:7f:37:
8e:6c:3e:19:29:82:e1:78:f8:fb:cd:7f:55:1c:4c:
9b:d7:75:3a:54:f8:dd:be:16:b6:ea:3e:09:d8:f0:
9d:ba:4d:39:1d:39:e4:a0:e8:bf:36:5e:c6:47:b3:
fa:25:c0:97:84:01:04:6e:fc:0b:23:1c:fc:1e:94:
fe:a6:9f:9a:46:b9:98:f1:71:09:02:d6:09:57:60:
e6:aa:45:0a:b5:84:49:18:3a:7b:57:ab:d1:ba:7d:
01:a0:5a:cf:a5:66:7e:b4:61:e1:1f:35:d8:31:61:
4a:d7:25:03:8d:d3:0e:66:25:bd:3d:d3:c5:81:a8:
25:db:0e:7c:c9:ad:0a:26:17:64:16:90:a5:66:11:
85:fc:b6:12:68:38:58:8f:d2:ab:8b:27:27:d9:0b:
71:83:50:3a:31:ab:70:eb:52:89:b2:17:c7:32:f3:
f9:17:e6:23:4c:a8:d3:ca:af:8e:d9:d4:2d:a7:f4:
bb:cc:5c:bf:2a:53:d5:ff:ee:b2:d7:57:e0:d4:b3:
a2:aa:c8:0a:1a:eb:9b:b6:7e:d3:f0:b1:c7:27:5a:
69:50:83:33:6e:7e:73:8d:7d:a7:e3:e9:9b:8a:ce:
cc:0d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
95:79:57:E2:6F:9D:EE:71:1B:E5:69:CC:70:BF:A4:06:68:B9:37:03
X509v3 Authority Key Identifier:
keyid:95:79:57:E2:6F:9D:EE:71:1B:E5:69:CC:70:BF:A4:06:68:B9:37:03
X509v3 Basic Constraints:
CA:TRUE
X509v3 Key Usage:
Digital Signature, Certificate Sign, CRL Sign
Signature Algorithm: sha256WithRSAEncryption
a1:de:0f:f1:15:1f:48:0b:62:03:76:df:f3:f5:c1:de:25:bc:
72:ba:0d:96:5d:e0:6f:95:d0:1f:67:ed:45:73:39:1b:f1:1a:
aa:6e:b6:55:0b:79:32:a2:18:3a:69:e4:4e:fc:35:19:15:f1:
6b:72:cb:a0:8e:9b:13:58:a6:d6:f5:06:9c:bc:df:ac:e8:73:
1c:db:ad:d9:0d:6a:15:67:66:26:28:ad:62:e9:cd:b5:e0:0a:
51:6d:c7:7e:45:49:40:e0:af:06:8a:68:9d:9e:4b:f9:53:41:
6e:cd:13:cb:e4:dc:9f:d3:93:09:fd:10:66:67:83:00:34:23:
4e:35:72:5f:a4:d4:cc:1d:2d:11:28:e8:48:fe:1e:14:d5:41:
05:ea:53:b5:f1:15:7b:12:23:71:3f:57:60:25:62:09:81:6a:
5f:39:08:51:ed:e6:72:5d:c0:a9:6a:50:88:73:8c:d0:38:85:
92:af:bb:c3:74:33:fc:31:b2:13:65:49:ee:53:9a:1d:37:c6:
04:7e:ff:b2:fc:e8:15:1c:13:f1:98:dc:e7:7c:2f:b8:05:86:
55:0d:eb:06:dd:75:0c:a1:7d:ac:1f:e3:90:09:41:32:73:0a:
58:1a:c0:83:87:10:be:f1:d5:74:ca:8f:ae:e8:8e:34:6e:88:
1b:3b:d4:d2
発行したCA証明書をIAM Roles Anywhereの信頼アンカーに登録できることを確認しておきます。
作成したCA証明書でダウンロードしたCSRに署名して、クラスター証明書を発行します。
# クラスター証明書の発行
$ openssl x509 -req -days 7 -in "$cluster_id"_ClusterCsr.csr \
-CA customerCA.crt \
-CAkey customerCA.key \
-CAcreateserial \
-out "$cluster_id"_CustomerHsmCertificate.crt
Signature ok
subject=/C=US/ST=CA/O=Cavium/OU=N3FIPS/L=SanJose/CN=HSM:E6EE997AE6AE962B7F7B119D53FF95:PARTN:9, for FIPS mode
Getting CA Private Key
Enter pass phrase for customerCA.key:
# クラスター証明書の確認
$ cat cluster-ieh7u5cvyuq_CustomerHsmCertificate.crt
-----BEGIN CERTIFICATE-----
MIIDeTCCAmECCQCDtGuCxiYhVDANBgkqhkiG9w0BAQsFADByMQswCQYDVQQGEwJK
UDEOMAwGA1UECAwFVG9reW8xFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UE
CgwTRGVmYXVsdCBDb21wYW55IEx0ZDEeMBwGA1UEAwwVaWFtLXJvbGVzLWFueXdo
.
.
(中略)
.
.
FDPR0AKlsMIumTBGLzmxF653RnvxvpiKS1bJ47/XHP5zgy3H3TBhkYIU9Bjm1xGd
uF66u38Fl8n5lVfWZ9AYPk0miNvuAgEOZYfE8GqxF3N0O6+8vZSCkkgLbSMPtI9E
X9XIjwtdOugbkrL0MZ/uFR1sXZiFtSKyWwhbIyGGwDmivMPOhZRIpPRr2bHKKRV5
cSTqO1yOv5zKIlw00LgvhwbuCWg6ZjzHAnXjcZE=
-----END CERTIFICATE-----
# クラスター証明書のSubjectを確認
$ openssl x509 -text -noout -in cluster-ieh7u5cvyuq_CustomerHsmCertificate.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
83:b4:6b:82:c6:26:21:54
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Tokyo, L=Default City, O=Default Company Ltd, CN=iam-roles-anywhere-ca
Validity
Not Before: Jul 13 05:12:38 2022 GMT
Not After : Jul 20 05:12:38 2022 GMT
Subject: C=US, ST=CA, O=Cavium, OU=N3FIPS, L=SanJose, CN=HSM:E6EE997AE6AE962B7F7B119D53FF95:PARTN:9, for FIPS mode
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:9d:5f:12:df:e0:2c:ce:69:36:02:3b:38:cb:93:
d0:0a:ef:61:38:76:80:09:46:d2:51:76:45:04:14:
5e:9c:60:c2:fa:d7:6c:e1:f4:8a:c2:f6:a6:1b:05:
86:d5:b4:ec:5b:bf:66:f4:02:5a:fa:c9:5a:b9:03:
5c:47:61:11:37:95:ad:d6:9e:7e:8e:32:d2:77:d3:
cb:64:6b:7c:67:73:58:1b:65:bc:b9:02:66:ec:43:
ae:8f:e8:5f:20:7c:5e:58:3e:e3:20:6d:6a:bb:db:
ba:e3:1f:15:ed:f6:fd:d0:9d:3f:4b:e0:73:76:ef:
44:1d:e8:7a:8b:df:90:ef:94:73:8a:ae:c7:82:bb:
9d:67:92:4d:0c:29:09:31:f3:39:ed:ff:6b:de:d3:
4c:02:08:82:73:9c:a5:39:ab:6f:6f:5e:25:48:22:
78:f2:d7:44:86:46:7c:57:b7:c4:63:ca:68:8b:23:
e1:2d:77:c7:ea:33:b9:99:55:b7:f0:c2:a8:01:87:
05:0e:85:c3:22:52:dd:8c:1f:a0:f0:cb:0e:1a:e7:
1f:b6:49:4e:42:a1:59:85:48:f4:fc:17:38:84:08:
93:a5:1f:8a:db:1d:99:8f:18:18:65:a7:54:b0:2f:
7e:95:7e:4e:00:bb:1c:77:8a:f8:f6:d3:ad:48:10:
bf:69
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
00:be:b8:fe:81:46:50:42:95:da:d9:a8:7c:2d:46:67:ec:61:
42:38:c5:38:5c:10:53:e4:48:24:2b:15:35:72:40:d2:a7:67:
6c:99:1b:af:3d:ae:14:59:83:ce:d7:de:ac:b1:f0:fb:c8:ab:
4e:50:58:5f:2c:89:09:6a:1a:77:be:87:47:43:7e:4d:ff:56:
a9:c1:ab:3f:35:aa:91:d5:80:b8:89:14:33:d1:d0:02:a5:b0:
c2:2e:99:30:46:2f:39:b1:17:ae:77:46:7b:f1:be:98:8a:4b:
56:c9:e3:bf:d7:1c:fe:73:83:2d:c7:dd:30:61:91:82:14:f4:
18:e6:d7:11:9d:b8:5e:ba:bb:7f:05:97:c9:f9:95:57:d6:67:
d0:18:3e:4d:26:88:db:ee:02:01:0e:65:87:c4:f0:6a:b1:17:
73:74:3b:af:bc:bd:94:82:92:48:0b:6d:23:0f:b4:8f:44:5f:
d5:c8:8f:0b:5d:3a:e8:1b:92:b2:f4:31:9f:ee:15:1d:6c:5d:
98:85:b5:22:b2:5b:08:5b:23:21:86:c0:39:a2:bc:c3:ce:85:
94:48:a4:f4:6b:d9:b1:ca:29:15:79:71:24:ea:3b:5c:8e:bf:
9c:ca:22:5c:34:d0:b8:2f:87:06:ee:09:68:3a:66:3c:c7:02:
75:e3:71:91
$
発行したクラスター証明書のSubject
から、確かにHSMクラスターの証明書であることが分かります。
用意したCA証明書とクラスター証明書を使ってクラスターを初期化します。
$ aws cloudhsmv2 initialize-cluster \
--cluster-id "$cluster_id" \
--signed-cert file://"$cluster_id"_CustomerHsmCertificate.crt \
--trust-anchor file://customerCA.crt \
--region us-east-1
{
"StateMessage": "Cluster is initializing. State will change to INITIALIZED upon completion.",
"State": "INITIALIZE_IN_PROGRESS"
}
クラスターの状態がINITIALIZE_IN_PROGRESS
になったようです。
マネジメントコンソールからもクラスターの状態がInitialize in progress
になっています。
3分ほど待つとクラスターの状態がInitialized
になりました。
クラスターのアクティブ化
次に、クラスターをアクティブにしてあげます。
事前準備として、AWS CloudHSMクライアントをインストールします。
# AWS CloudHSMクライアントのRPMをダウンロード
$ wget https://s3.amazonaws.com/cloudhsmv2-software/CloudHsmClient/EL7/cloudhsm-client-latest.el7.x86_64.rpm
--2022-07-13 05:23:06-- https://s3.amazonaws.com/cloudhsmv2-software/CloudHsmClient/EL7/cloudhsm-client-latest.el7.x86_64.rpm
Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.40.24
Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.40.24|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1878962 (1.8M) [binary/octet-stream]
Saving to: ‘cloudhsm-client-latest.el7.x86_64.rpm’
100%[===================================================================================================================================>] 1,878,962 --.-K/s in 0.01s
2022-07-13 05:23:06 (124 MB/s) - ‘cloudhsm-client-latest.el7.x86_64.rpm’ saved [1878962/1878962]
# AWS CloudHSMクライアントのインストール
$ sudo yum install ./cloudhsm-client-latest.el7.x86_64.rpm
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Examining ./cloudhsm-client-latest.el7.x86_64.rpm: cloudhsm-client-3.4.4-1.el7.x86_64
Marking ./cloudhsm-client-latest.el7.x86_64.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package cloudhsm-client.x86_64 0:3.4.4-1.el7 will be installed
--> Processing Dependency: libncurses.so.5()(64bit) for package: cloudhsm-client-3.4.4-1.el7.x86_64
amzn2-core | 3.7 kB 00:00:00
--> Running transaction check
---> Package ncurses-compat-libs.x86_64 0:6.0-8.20170212.amzn2.1.3 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================================
Package Arch Version Repository Size
=============================================================================================================================================================================
Installing:
cloudhsm-client x86_64 3.4.4-1.el7 /cloudhsm-client-latest.el7.x86_64 5.0 M
Installing for dependencies:
ncurses-compat-libs x86_64 6.0-8.20170212.amzn2.1.3 amzn2-core 308 k
Transaction Summary
=============================================================================================================================================================================
Install 1 Package (+1 Dependent package)
Total size: 5.3 M
Total download size: 308 k
Installed size: 5.9 M
Is this ok [y/d/N]: y
Downloading packages:
ncurses-compat-libs-6.0-8.20170212.amzn2.1.3.x86_64.rpm | 308 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : ncurses-compat-libs-6.0-8.20170212.amzn2.1.3.x86_64 1/2
Installing : cloudhsm-client-3.4.4-1.el7.x86_64 2/2
Verifying : ncurses-compat-libs-6.0-8.20170212.amzn2.1.3.x86_64 1/2
Verifying : cloudhsm-client-3.4.4-1.el7.x86_64 2/2
Installed:
cloudhsm-client.x86_64 0:3.4.4-1.el7
Dependency Installed:
ncurses-compat-libs.x86_64 0:6.0-8.20170212.amzn2.1.3
Complete!
CloudHSMクライアントを使用するにはCA証明書を/opt/cloudhsm/etc/
に移動させる必要があるので、移動させておきます。
# CA証明書の移動
$ sudo mv customerCA.crt /opt/cloudhsm/etc/customerCA.crt
# CA証明書が指定のディレクトリに移動したことを確認
$ ls -l /opt/cloudhsm/etc/
total 28
drwxr-xr-x 2 root root 42 Jul 13 05:23 certs
-rwxr-xr-x 1 root root 1342 Dec 30 2021 client.crt
-rwxr-xr-x 1 root root 1704 Dec 30 2021 client.key
-rw-r--r-- 1 root root 1156 Jul 13 05:26 cloudhsm_client.cfg
-rw-r--r-- 1 root root 1179 Dec 30 2021 cloudhsm_client.cfg.old
-rw-r--r-- 1 root root 704 Jul 13 05:26 cloudhsm_mgmt_util.cfg
-rw-r--r-- 1 root root 600 Dec 30 2021 cloudhsm_mgmt_util.cfg.old
-rw-r--r-- 1 ssm-user ssm-user 1367 Jul 13 05:04 customerCA.crt
証明書を移動させないと、CloudHSM管理ユーティリティ(CMU)起動時に以下のようなエラーが出力されます。
$ /opt/cloudhsm/bin/cloudhsm_mgmt_util /opt/cloudhsm/etc/cloudhsm_mgmt_util.cfg
Ignoring E2E enable flag in the configuration file
Connecting to the server(s), it may take time
depending on the server(s) load, please wait...
Connecting to server '172.31.40.54': hostname '172.31.40.54', port 2225...
Connected to server '172.31.40.54': hostname '172.31.40.54', port 2225.
/opt/cloudhsm/etc/customerCA.crt,
partition owner certificate not exist at given path
Server 0(172.31.40.54) is in unencrypted mode now...
running in limited commands mode
Error: partition owner certificate doesn't exist at given path.
Failed to create client ssl ctx
E2E Session failed: E2E setup failed
Enabling E2E failed
証明書を移動させたらCloudHSMクライアントの設定ファイルを更新し、HSMのIPアドレスを指定します。
$ sudo /opt/cloudhsm/bin/configure -a 172.31.40.54
Updating server config in /opt/cloudhsm/etc/cloudhsm_client.cfg
Updating server config in /opt/cloudhsm/etc/cloudhsm_mgmt_util.cfg
CloudHSM管理ユーティリティ(CMU)でHSMに接続し、PreCrypto Officer (PRECO)の認証情報を使用してHSM にログインします。
HSMのユーザーの詳細は以下AWS公式ドキュメントをご確認ください。
$ /opt/cloudhsm/bin/cloudhsm_mgmt_util /opt/cloudhsm/etc/cloudhsm_mgmt_util.cfg
Ignoring E2E enable flag in the configuration file
Connecting to the server(s), it may take time
depending on the server(s) load, please wait...
Connecting to server '172.31.40.54': hostname '172.31.40.54', port 2225...
Connected to server '172.31.40.54': hostname '172.31.40.54', port 2225.
E2E enabled on server 0(172.31.40.54)
aws-cloudhsm>
現在のユーザー一覧を確認します。
aws-cloudhsm>listUsers
Users on server 0(172.31.40.54):
Number of users found:2
User Id User Type User Name MofnPubKey LoginFailureCnt 2FA
1 PRECO admin NO 0 NO
2 AU app_user NO 0 NO
PRECOユーザーとしてHSMにログインし、PRECOユーザーのパスワードを変更します。
# PRECOユーザーとしてHSMにログイン
aws-cloudhsm>loginHSM PRECO admin password
loginHSM success on server 0(172.31.40.54)
# PRECOユーザーのパスワードを変更
aws-cloudhsm>changePswd PRECO admin fbAGRQ@NP!dY4LHDK7HK!*UYnbxKc6gu
*************************CAUTION********************************
This is a CRITICAL operation, should be done on all nodes in the
cluster. AWS does NOT synchronize these changes automatically with the
nodes on which this operation is not executed or failed, please
ensure this operation is executed on all nodes in the cluster.
****************************************************************
Do you want to continue(y/n)?y
Changing password for admin(PRECO) on 1 nodes
changePswd success on server 0(172.31.40.54)
# PRECO から CO に変わったことを確認
aws-cloudhsm>listUsers
Users on server 0(172.31.40.54):
Number of users found:2
User Id User Type User Name MofnPubKey LoginFailureCnt 2FA
1 CO admin NO 0 NO
2 AU app_user NO 0 NO
ユーザーのタイプがPRECOからCOに変更されていることを確認できました。
このタイミングでマネジメントコンソールからクラスターの状態を確認すると、Active
になっていました。
キーペアの生成
試しにHSM上でキーペアを作成してみます。
キーペアの作成などキーの管理はCrypto user(CU)でなければできません。
現在CUはいないので事前準備としてCUを作成します。CMUからCOとしてログインし、新しくCUを作成します。
# COとしてログイン
aws-cloudhsm>loginHSM CO admin fbAGRQ@NP!dY4LHDK7HK!*UYnbxKc6gu
loginHSM success on server 0(172.31.40.54)
# CUを作成
aws-cloudhsm>createUser CU crypto_user cYoav.j8ZG87D!NmFvU.sjVATb8RwE4r
*************************CAUTION********************************
This is a CRITICAL operation, should be done on all nodes in the
cluster. AWS does NOT synchronize these changes automatically with the
nodes on which this operation is not executed or failed, please
ensure this operation is executed on all nodes in the cluster.
****************************************************************
Do you want to continue(y/n)?y
Creating User crypto_user(CU) on 1 nodes
createUser success on server 0(172.31.40.54)
# CUが作成されたことを確認
aws-cloudhsm>listUsers
Users on server 0(172.31.40.54):
Number of users found:3
User Id User Type User Name MofnPubKey LoginFailureCnt 2FA
1 CO admin NO 0 NO
2 AU app_user NO 0 NO
3 CU crypto_user NO 0 NO
キー管理ユーティリティ(KMU)でキーペアを作成します。
# KMUのサービスを起動
$ sudo service cloudhsm-client start
Redirecting to /bin/systemctl start cloudhsm-client.service
# KMUでHSMに接続
$ /opt/cloudhsm/bin/key_mgmt_util
Cfm3Initialize() returned app id : 01008000
session_handle 1008002
Current FIPS mode is: 00000002
Help Commands Available:
Syntax: <command> -h
Command Description
======= ===========
exit Exits this application
help Displays this information
Configuration and Admin Commands
getHSMInfo Gets the HSM Information
getPartitionInfo Gets the Partition Information
listUsers Lists all users of a partition
loginStatus Gets the Login Information
loginHSM Login to the HSM
logoutHSM Logout from the HSM
M of N commands
getToken Initiate an MxN service and get Token
delToken delete Token(s)
approveToken Approves an MxN service
listTokens List all Tokens in the current partition
Key Generation Commands
Asymmetric Keys:
genRSAKeyPair Generates an RSA Key Pair
genDSAKeyPair Generates a DSA Key Pair
genECCKeyPair Generates an ECC Key Pair
Symmetric Keys:
genPBEKey Generates a PBE DES3 key
genSymKey Generates a Symmetric keys
Key Import/Export Commands
createPublicKey Creates an RSA public key
importPubKey Imports RSA/DSA/EC Public key
exportPubKey Exports RSA/DSA/EC Public key
importPrivateKey Imports RSA/DSA/EC private key
exportPrivateKey Exports RSA/DSA/EC private key
imSymKey Imports a Symmetric key
exSymKey Exports a Symmetric key
wrapKey Wraps a key from HSM using the specified handle
unWrapKey UnWraps a key into HSM using the specified handle
Key Management Commands
deleteKey Delete Key
setAttribute Sets an attribute of an object
getKeyInfo Get Key Info about shared users/sessions
findKey Find Key
findSingleKey Find single Key
getAttribute Reads an attribute from an object
Certificate Setup Commands
getCert Gets Partition Certificates stored on HSM
Key Transfer Commands
insertMaskedObject Inserts a masked object
extractMaskedObject Extracts a masked object
Management Crypto Commands
sign Generates a signature
verify Verifies a signature
aesWrapUnwrap Does PKCS5 Padded AES Wrap/Unwrap
Helper Commands
Error2String Converts Error codes to Strings
save key handle in fake PEM format
getCaviumPrivKey Saves an RSA private key handle
in fake PEM format
IsValidKeyHandlefile Checks if private key file has
an HSM key handle or a real key
listAttributes List all attributes for getAttributes
listECCCurveIds List HSM supported ECC CurveIds
# 事前に作成したCUでログイン
Command: loginHSM -u CU -s crypto_user -p cYoav.j8ZG87D!NmFvU.sjVATb8RwE4r
Cfm3LoginHSM returned: 0x00 : HSM Return: SUCCESS
Cluster Status:
Node id 0 status: 0x00000000 : HSM Return: SUCCESS
# キーが空であることを確認
Command: findKey
Total number of keys present: 0
Cluster Status:
Node id 0 status: 0x00000000 : HSM Return: SUCCESS
Cfm3FindKey returned: 0x00 : HSM Return: SUCCESS
# RSAのキーペアを作成
Command: genRSAKeyPair -m 2048 -e 65537 -l rsa_test
Cfm3GenerateKeyPair returned: 0x00 : HSM Return: SUCCESS
Cfm3GenerateKeyPair: public key handle: 6 private key handle: 7
Cluster Status:
Node id 0 status: 0x00000000 : HSM Return: SUCCESS
# キーが2つあることを確認
Command: findKey
Total number of keys present: 2
Number of matching keys from start index 0::1
Handles of matching keys:
6, 7
Cluster Status:
Node id 0 status: 0x00000000 : HSM Return: SUCCESS
Cfm3FindKey returned: 0x00 : HSM Return: SUCCESS
公開鍵のキーハンドルが6
、秘密鍵のキーハンドルが7
としてHSMに追加されました。
作成したキーペアの情報をダウンロードして確認してみます。
# 出力できるキーペアの情報を確認
Command: listAttributes
Description
===========
The following are all of the possible attribute values for getAttributes.
OBJ_ATTR_CLASS = 0
OBJ_ATTR_TOKEN = 1
OBJ_ATTR_PRIVATE = 2
OBJ_ATTR_LABEL = 3
OBJ_ATTR_TRUSTED = 134
OBJ_ATTR_KEY_TYPE = 256
OBJ_ATTR_ID = 258
OBJ_ATTR_SENSITIVE = 259
OBJ_ATTR_ENCRYPT = 260
OBJ_ATTR_DECRYPT = 261
OBJ_ATTR_WRAP = 262
OBJ_ATTR_UNWRAP = 263
OBJ_ATTR_SIGN = 264
OBJ_ATTR_VERIFY = 266
OBJ_ATTR_DERIVE = 268
OBJ_ATTR_LOCAL = 355
OBJ_ATTR_MODULUS = 288
OBJ_ATTR_MODULUS_BITS = 289
OBJ_ATTR_PUBLIC_EXPONENT = 290
OBJ_ATTR_VALUE_LEN = 353
OBJ_ATTR_EXTRACTABLE = 354
OBJ_ATTR_NEVER_EXTRACTABLE = 356
OBJ_ATTR_ALWAYS_SENSITIVE = 357
OBJ_ATTR_DESTROYABLE = 370
OBJ_ATTR_KCV = 371
OBJ_ATTR_WRAP_WITH_TRUSTED = 528
OBJ_ATTR_WRAP_TEMPLATE = 1073742353
OBJ_ATTR_UNWRAP_TEMPLATE = 1073742354
OBJ_ATTR_ALL = 512
# 秘密鍵の情報をダウンロード
Command: getAttribute -o 7 -a 512 -out privatekey_attr.txt
Attribute size: 813, count: 27
Written to: privatekey_attr.txt file
Cfm3GetAttribute returned: 0x00 : HSM Return: SUCCESS
# 公開鍵の情報をダウンロード
Command: getAttribute -o 6 -a 512 -out publickey_attr.txt
Attribute size: 801, count: 26
Written to: publickey_attr.txt file
Cfm3GetAttribute returned: 0x00 : HSM Return: SUCCESS
ダウンロードした情報を確認してみます。
# 秘密鍵の情報を確認
$ cat privatekey_attr.txt
OBJ_ATTR_CLASS
0x03
OBJ_ATTR_KEY_TYPE
0x00
OBJ_ATTR_TOKEN
0x01
OBJ_ATTR_PRIVATE
0x01
OBJ_ATTR_ENCRYPT
0x00
OBJ_ATTR_DECRYPT
0x01
OBJ_ATTR_WRAP
0x00
OBJ_ATTR_UNWRAP
0x01
OBJ_ATTR_SIGN
0x01
OBJ_ATTR_VERIFY
0x00
OBJ_ATTR_LOCAL
0x01
OBJ_ATTR_SENSITIVE
0x01
OBJ_ATTR_EXTRACTABLE
0x01
OBJ_ATTR_LABEL
rsa_test
OBJ_ATTR_ID
OBJ_ATTR_VALUE_LEN
0x000004c1
OBJ_ATTR_KCV
0xfee3ab
OBJ_ATTR_MODULUS
0x9d2a1a1a40cf302ec30691caed87cadfdf4551cf0b717f88f1c790b4483754493eb47f4837c1657ef1732aab6826fc916cb8acaa9443541f42a598e14488821d63c02d9a1aac160465ac7e3db354e9292d80269c85c18af39072fa81b1240546099eb412cb678365b70ab0b029db47430e82b5f9ca8ed8f140b1812aa1a6c1a2486b5c385dc3019ce66a66f93814586270c7342fe2a424511f4a87570c5157cd4b6fd9447325e8a6693720b41601a336abe6efd3d6a8f2133edbd599f90d3c78afe2125917dba02aeb3890dc5575adfcaaf9c83568a890b811437e4effc8c23415632afff884a9dd21d489ee14b3644e600f0833ac6f53d71eea7e7fe8c5cdd3
OBJ_ATTR_MODULUS_BITS
0x00000800
OBJ_ATTR_PUBLIC_EXPONENT
0x010001
OBJ_ATTR_VENDOR_DEFINED
0x00000280
OBJ_ATTR_TRUSTED
0x00
OBJ_ATTR_WRAP_WITH_TRUSTED
0x00
OBJ_ATTR_DERIVE
0x00
OBJ_ATTR_ALWAYS_SENSITIVE
0x01
OBJ_ATTR_NEVER_EXTRACTABLE
0x00
OBJ_ATTR_DESTROYABLE
0x01
# 公開鍵の情報を確認
$ cat publickey_attr.txt
OBJ_ATTR_CLASS
0x02
OBJ_ATTR_KEY_TYPE
0x00
OBJ_ATTR_TOKEN
0x01
OBJ_ATTR_PRIVATE
0x01
OBJ_ATTR_ENCRYPT
0x01
OBJ_ATTR_DECRYPT
0x00
OBJ_ATTR_WRAP
0x01
OBJ_ATTR_UNWRAP
0x00
OBJ_ATTR_SIGN
0x00
OBJ_ATTR_VERIFY
0x01
OBJ_ATTR_LOCAL
0x01
OBJ_ATTR_SENSITIVE
0x00
OBJ_ATTR_EXTRACTABLE
0x01
OBJ_ATTR_LABEL
rsa_test
OBJ_ATTR_ID
OBJ_ATTR_VALUE_LEN
0x00000200
OBJ_ATTR_KCV
0xfee3ab
OBJ_ATTR_MODULUS
0x9d2a1a1a40cf302ec30691caed87cadfdf4551cf0b717f88f1c790b4483754493eb47f4837c1657ef1732aab6826fc916cb8acaa9443541f42a598e14488821d63c02d9a1aac160465ac7e3db354e9292d80269c85c18af39072fa81b1240546099eb412cb678365b70ab0b029db47430e82b5f9ca8ed8f140b1812aa1a6c1a2486b5c385dc3019ce66a66f93814586270c7342fe2a424511f4a87570c5157cd4b6fd9447325e8a6693720b41601a336abe6efd3d6a8f2133edbd599f90d3c78afe2125917dba02aeb3890dc5575adfcaaf9c83568a890b811437e4effc8c23415632afff884a9dd21d489ee14b3644e600f0833ac6f53d71eea7e7fe8c5cdd3
OBJ_ATTR_MODULUS_BITS
0x00000800
OBJ_ATTR_PUBLIC_EXPONENT
0x010001
OBJ_ATTR_TRUSTED
0x00
OBJ_ATTR_WRAP_WITH_TRUSTED
0x00
OBJ_ATTR_DERIVE
0x00
OBJ_ATTR_ALWAYS_SENSITIVE
0x00
OBJ_ATTR_NEVER_EXTRACTABLE
0x00
OBJ_ATTR_DESTROYABLE
0x01
キー属性リファレンスと照らし合わせながら表示された情報を確認していきます。
OBJ_ATTR_CLASS
からどちらが公開鍵か秘密鍵か確認できます。また、OBJ_ATTR_ENCRYPT
やOBJ_ATTR_WRAP
からデータもしくはキーの暗号化に使用できるかが確認できます。
秘密鍵のインポート
それでは秘密鍵をHSMにインポートしてみます。
例によって秘密鍵がパスフレーズで暗号化されたままだと、インポート時にfailed to read private key from file
とエラーになります。
Command: importPrivateKey -f customerCA.key -l customer-ca-key -w 8
failed to read private key from file
秘密鍵のパスフレーズを解除しておきます。
# 秘密鍵のパスフレーズを解除
$ sudo openssl rsa -in customerCA.key -out decrypted_customerCA.key
Enter pass phrase for customerCA.key:
writing RSA key
# 秘密鍵のパスフレーズが解除されたことを確認
$ cat decrypted_customerCA.key
-----BEGIN RSA PRIVATE KEY-----
.
.
(中略)
.
.
-----END RSA PRIVATE KEY-----
KMUを使ってCUでログインし、秘密鍵をimportPrivateKeyでインポートします。
秘密鍵をインポートする際にはAESキー(ラップキー)を使用して暗号化(ラップ)する必要があります。そのためgenSymKeyでインポート前にこのセッションでのみ有効なAESキーを生成しています。
# CUでログイン
Command: loginHSM -u CU -s crypto_user -p cYoav.j8ZG87D!NmFvU.sjVATb8RwE4r
Cfm3LoginHSM returned: 0x00 : HSM Return: SUCCESS
Cluster Status:
Node id 0 status: 0x00000000 : HSM Return: SUCCESS
# 秘密鍵をインポートする際のAESキーを生成
Command: genSymKey -t 31 -s 16 -sess -l import-wrapping-key
Cfm3GenerateSymmetricKey returned: 0x00 : HSM Return: SUCCESS
Symmetric Key Created. Key Handle: 8
Cluster Status:
Node id 0 status: 0x00000000 : HSM Return: SUCCESS
# 秘密鍵をインポート
Command: importPrivateKey -f decrypted_customerCA.key -l customer-ca-key -w 8
BER encoded key length is 1219
Cfm3ImportWrapKey returned: 0x00 : HSM Return: SUCCESS
Cfm3CreateUnwrapTemplate2 returned: 0x00 : HSM Return: SUCCESS
Cfm3ImportUnWrapKey: 0x00 : HSM Return: SUCCESS
Private Key Imported. Key Handle: 9
Cluster Status:
Node id 0 status: 0x00000000 : HSM Return: SUCCESS
秘密鍵のインポートができました。
秘密鍵のエクスポート
最後に秘密鍵をexportPrivateKeyでエクスポートをします。
エクスポートする際もAESキーを使用して暗号化する必要があります。
Command: exportPrivateKey -k 9 -w 8 -out export_decrypted_customerCA.key
Cfm3ExportWrapKey returned: 0x00 : HSM Return: SUCCESS
Cfm3ExportUnwrapKey returned: 0x00 : HSM Return: SUCCESS
PEM formatted private key is written to export_decrypted_customerCA.key
エクスポートされた秘密鍵を確認してみます。
$ cat export_decrypted_customerCA.key
-----BEGIN PRIVATE KEY-----
.
.
(中略)
.
.
-----END PRIVATE KEY-----
どうやらエクスポートした秘密鍵はRSA形式になっていないようです。
エクスポートした秘密鍵RSA形式に変換して、インポートした秘密鍵と比較してみます。
# エクスポートした秘密鍵RSA形式に変換
$ openssl rsa -in export_decrypted_customerCA.key -check -out rsa_export_decrypted_customerCA.key
writing RSA key
# インポート/エクスポートした秘密鍵を比較
$ diff -u decrypted_customerCA.key rsa_export_decrypted_customerCA.key
--- decrypted_customerCA.key 2022-07-13 06:50:24.934448694 +0000
+++ rsa_export_decrypted_customerCA.key 2022-07-13 07:50:35.763903985 +0000
@@ -1,3 +1,4 @@
+RSA key ok
-----BEGIN RSA PRIVATE KEY-----
RSA形式に変更した際にRSA key ok
と追加されましたが、それ以外はインポート/エクスポートした秘密鍵が一致しました。
マネージドでハードウェアレベルの鍵の管理ができる
AWS CloudHSMで秘密鍵のインポートとエクスポートしてみました。
今までHSMを触った経験がなければ少し慣れるのに時間がかかりそうですが、マネージドでハードウェアレベルの鍵の管理ができるのはありがたいですね。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!