Raw Public Key をサポート

wolfSSLでは”Raw Public Keys(RPK)”のハンドリングをサポートを追加しました。

Raw Public Keys の必要性

TLSを実装する組み込み機器が増えてきていますが、厳しいリソース制約(MCUパワーやメモリ)を持つ機器では証明書チェーンの検証は大きな負荷です。簡便に通信相手の公開鍵を得る方法が求められています。

“Raw Public keys(RPK)” をTLSあるいはDTLSで使用できる方法がRFC7250で規定されています。RFC7250は一般的に使用されているX509v3証明書の代わりに公開鍵に関する情報のみを含んだサブセット(すなわちRPK)を使用することを規定しています。

証明書を使う目的は、通信相手を認証することです。その目的の為に通常、PKI基盤が使われます。ルートCAと呼ばれる信用のアンカーからリーフ証明書までの証明書のチェーンの全てで署名検証が行われます。一方、RPKを使ったTLSではそのような証明書チェーンはなく、単に公開鍵が相手に送られるだけです。PKIを使った認証は適用できず、異なる認証方法が必要になることは明らかです。RFC7250ではこの方法の一つとして”DNS-Based Authentication of Named Entities(DANE)”を導入することを勧めています。

TLSハンドシェークでのRPKの拡張

RPKはTLSの中ではこれまでのX509証明書の置き換えとして使われます。しかし、運ぶ情報はこれまでの証明書(X509)とは異なるのでそのハンドリングにはセッション両端でのネゴシエーションが必要となっています。ClientHelloとServerHelloにRPKをハンドリングするための新たな拡張が追加されています。client_certificate_typeおよびserver_certificate_type拡張です。

wolfSSLでのRPKのサポート

wolfSSLでRPKのサポートを有効にするためには、HAVE_RPKマクロ定義を指定してビルドを行ってください。RPKのハンドリングロジックが組み込まれRPK専用の関数が使用できるようになります。

受信したRPKの検証はTLSでは提供されません。ユーザーがTLSの外で検証を行う必要があります。wolfSSLではこの目的の為に、ユーザーの証明書検証コールバックを呼び出す方法を提供しています。

ユーザーは”WOLFSSL_ALWAYS_VERIFY_CB“マクロを定義してビルドします。TLSハンドシェーク中に相手から受信したRPKをコールバック関数内で検証することができます。

RPKを使ったハンドシェーク

RPKのサポートを有効にしたwolfSSLのサンプルクライアントとGnuTLSサーバーを使ってTLS1.3通信を行った結果を紹介します。gnutlsサーバー側にはRPK証明書とその公開鍵に対応する秘密鍵を指定してHTTPS接続を待ち受けさせます。wolfSSL クライアントからの接続に成功すると受信したRPK、暗号スイート等の情報を出力します。

$ gnutls-serv --http --x509fmtder  --priority NORMAL:+CTYPE-CLI-RAWPK:+CTYPE-SRV-RAWPK --rawpkfile ../Server-cert-RPK.der --rawpkkeyfile ../server-key.der

HTTP Server listening on IPv4 0.0.0.0 port 5556...done
HTTP Server listening on IPv6 :: port 5556...done

* Accepted connection from IPv4 127.0.0.1 port 50420 on Thu Jun 29 15:59:24 202
- Peer's certificate was NOT verified.
- Description: (TLS1.3-Raw Public Key)-(ECDHE-SECP521R1)-(RSA-PSS-RSAE-SHA512)-(AES-128-GCM)
- Session ID: CF:8C:E9:38:D6:5B:E9:D7:58:DF:29:6C:D9:6E:F1:CA:70:36:13:DD:75:80:1E:6B:0C:3C:1C:32:7A:52:FE:A2
- Certificate type: Raw Public Key
- Got 1 Raw public-key(s).
- Raw pk info:
- PK algo: RSA

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwwPRK/45pDJFO1PIhCsq
fHSavaoqUgdH1qY2sgcyjtC6aXvGw0Se1IFI/S1oootnu6F1yDYsStIb94u6zw35
7+zxgR57mwNHmr9lzH9lJGmm6BSJW+Q098WwFJP1Z3s6enjhAVZWkaYTQo3SPECc
TO/Rht83URsMoTv18aNKNeThzpbfG36/TpfQEOioCDCBryALQxTFdGe0MoJvjYbC
iECZNoO6HkByIhfXUmUkc7DO7xnNrv94bHvAEgPUTnINUG07ozujmV6dyNkMhbPZ
itlUJttt+qy7/yVMxNF59HHThkAYE7BjtXJOMMSXhIYtVi/XFfd/wK71/Fvl+6G6
0wIDAQAB
-----END PUBLIC KEY-----

- Ephemeral EC Diffie-Hellman parameters
 - Using curve: SECP521R1
 - Curve size: 528 bits
- Version: TLS1.3
- Server Signature: RSA-PSS-RSAE-SHA512
- Client Signature: RSA-PSS-RSAE-SHA256
- Cipher: AES-128-GCM
- MAC: AEAD
- Options:
- Channel binding 'tls-unique':
Scheduling inactive connection for close

同時にWiresharkでキャプチャしたパケットを示します:

ClientHelloにserver_certificate_type拡張とclient_certificate_type拡張が含まれていることがわかります。

もし、ご質問があればinfo@wolfssl.jpまでお寄せください。

原文:https://www.wolfssl.com/wolfssl-supports-raw-public-keys/