[iOS]SecPKCS12Import errorCode=-25293、p12するときにopensslコマンドのlegacyを使えばうまくいくかも
2024/05/06
2024/05/12
awsiot
ios
mqtt
objective-c
openssl
swift
経緯
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 にインポートできない
: