プログラマメモ2 - programmer no memo2

[iOS]SecPKCS12Import errorCode=-25293、p12するときにopensslコマンドのlegacyを使えばうまくいくかも 2024/05/06
2024/05/12

経緯

AWSIoTを使ってMQTT通信のお試しをしてみようと考えたわけなのですが、クライアント認証にp12形式を使うようだというところまで来たのでした。
MQTT通信するためのライブラリは他にもありそうだったのですが、どうせAWSのIotCoreを使うのでここはAWSのSDKを使うといいかなという感じでした。
まずはそこから、AWSIoTManager.importIdentityを使うのだろうということで、opensslコマンド使ってp12作成して読ませると結果がfalse...

そこで悩むのでした。

環境

xcode(Version 15.3),swift,cocoapod

AWSIoTのバージョン 2.36.0

opensslのバージョン

% openssl -version
OpenSSL 3.3.0 9 Apr 2024 (Library: OpenSSL 3.3.0 9 Apr 2024)

# 証明書を作成
aws iot create-keys-and-certificate --set-as-active \
--certificate-pem-outfile "certificate.pem" \
--public-key-outfile "publicKey.pem" \
--private-key-outfile "privateKey.pem"


# ダウンロードしておきます。
AmazonRootCA1.pem はダウンロードしておきます。


AWSIoTManager.importIdentityは内部でSecPKCS12Importを使っていた

AWSIoTManager.importIdentityは、true.falseしか返さない..デバッグ(AWSDDLogError)の出力の仕方がすぐにわからずxcodeのデバッガでみていきました。
cocoapodsで環境を作っていたので、フレームワーク(ライブラリ)のソースコードがぱっとみれたのはよかった。

すると、SecPKCS12Importが返すstatusがerrSecAuthFailed=-25293というのがわかりました。そしてここで悩む。

いろいろ調べていくとKeychainが扱える暗号方式が、opensslのバージョンがかわって互換性の問題がありそうだということのようでした。 そしてlegacyのオプションでうまくいくというところまでいったのでした。


legacyつけないほう、clientA.p12
openssl pkcs12 -export -in certificate.pem -inkey privateKey.pem -certfile AmazonRootCA1.pem -out clientA.p12

legacyをつけた、clientB.p12
openssl pkcs12 -legacy -export -in certificate.pem -inkey privateKey.pem -certfile AmazonRootCA1.pem -out clientB.p12


教訓、自分向け

教訓というほどのことではないのですが、検索エンジンを使う際、自分が同じ検索結果を次にだせる保証はないので、キーワードはメモしておいたほうがよい。

あと、こういうのってみなさんどうやって解決していくのだろう...

p12ファイルを保持したアプリをつくったとして、いろいろ時間がたって、突然、SecPKCS12Importしたら動かないということはないよね....

参考

SecPKCS12Import is failing to import P12 certificate.
Amazon ルート CA 証明書をダウンロードする
OpenSSL 3系で発行された p12 形式の証明書が macOS にインポートできない

: