3

.NetプログラムでOpenSSLコードを使用しようとしています。コードは次のとおりです。

openssl pkcs12 -in "My PassKit Cert.p12" -clcerts -nokeys -out certificate.pem
openssl pkcs12 -in "My PassKit Cert.p12" -nocerts -out key.pem
smime -binary -sign -signer certificate.pem -inkey key.pem -in manifest.json -out signature -outform DER

.Net OpenSSLを使用しようとしましたが、使用方法がまったくわからず、適切なドキュメントが見つかりませんでした。同じ署名プロセスを実行するために.Netを使用することにしました。コードは次のとおりです。

var dataToSign = System.IO.File.ReadAllBytes(filePathToSign);
ContentInfo contentInfo = new ContentInfo(dataToSign);

X509Certificate2 signerCert = new X509Certificate2(System.IO.File.ReadAllBytes(signerPfxCertPath), signerPfxCertPassword);

var signedCms = new SignedCms(contentInfo, true);
var signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, signerCert);

signer.IncludeOption = X509IncludeOption.EndCertOnly;
signedCms.ComputeSignature(signer);

var myCmsMessage = signedCms.Encode();

var buf = Encoding.Convert(Encoding.UTF7, Encoding.UTF8, myCmsMessage);

return Encoding.UTF8.GetString(buf, 0, buf.Length);

ただし、C#とOpenSSLの結果は同じではありません。誰かが私を助けてくれますか?

前もって感謝します!

4

1 に答える 1

4

私はこれを最終的に機能させました!

まず、ここに移動して、アップルのルート証明書をインストールする必要があります。

http://www.apple.com/certificateauthority/

(それは最初のものです)。信頼できるルート機関にインストールします。Macにはすでにこれがあります。

次に、開発者証明書を信頼できるルート機関としてインストールします。これは、開発者ポータルにあり、デバイスの追加、パスキットキーの作成などを行います。

https://developer.apple.com/ios/manage/certificates/team/index.action

(そのためにはログインが必要です)

次に、開発ポータルでパスキットキーを生成し、ダウンロードしてMacにインストールし、秘密キーを使用して.p12ファイルとしてエクスポートする必要があります。

次に、このファイルをWindowsマシンに移動して使用できます。マニフェストを生成した後、このコードを使用しました。

var cert = new X509Certificate2(@"path-to-your.p12", "password");

var buffer = File.ReadAllBytes(Path.Combine(basePath, "manifest.json"));

ContentInfo cont = new ContentInfo(buffer);
var cms = new SignedCms(cont, true);
var signer = new CmsSigner(SubjectIdentifierType.SubjectKeyIdentifier, cert);

signer.IncludeOption = X509IncludeOption.ExcludeRoot;

cms.ComputeSignature(signer);

var myCmsMessage = cms.Encode();


File.WriteAllBytes(Path.Combine(basePath, "signature"), myCmsMessage);

申し訳ありませんが、これはかなり厄介なコードですが、機能します:)

設定することを忘れないでください

"passTypeIdentifier": "pass.com.yourcompany.NameOfYourPass"、 "teamIdentifier": "あなたのチームID"、

pass.jsonで!

于 2012-07-26T14:47:34.863 に答える