問題タブ [mscapi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 「Windows-MY」キーストアは、使用可能なすべてのエイリアスを一覧表示しません
個人用 (Windows) キーストアにインストールされている使用可能なすべての証明書を一覧表示する際に問題があります。
次のコードを使用して、すべての証明書エイリアスのリストを取得します。
正常に動作し、最近インストールした証明書が 2 つ表示されます。
でも。
コンピューターの再起動後、コードには 1 つの証明書エイリアスのみが一覧表示されますが、システム (certmgr.msc を使用) ではまだ 2 つの証明書がアクティブになっています。
さらに、インストールされた証明書はスマートカードからのものです: - ENCARD (ENIGMA CAPI を使用) - UNIZETO CARD (詳細は不明)
APIでENCARDを使用すると問題が発生するようです。再起動後、UNIZETO カードは正常に動作します。
何か案は?
windows - Windows 8 で CryptImportKey が失敗する
Crypto32 Windows を使用するとCryptoImportKey
、Windows 8.1 で関数が失敗し、ERROR_INVALID_PARAMETER が返されます。以前のすべてのバージョンの Windows で問題なく動作しました。
誰かがそれについてのヒントを持っていますか?
コードは次のとおりです。
c++ - OpenSSL 署名と CAPI 検証
私は CAPICOM ライブラリを使用していますが、Android と iOS では利用できません。私の知る限り、CAPICOM 署名付きメッセージは PKCS#7 形式です。OpenSSL を使用して、CAPICOM のように署名付きメッセージを作成したいと考えています。
私が使用したOpenSSLコマンド:
次に、このサンプルとして CAPICOM で検証しました: http://www.codeproject.com/Articles/9691/Using-CAPICOM-in-NET-for-Digital-Signatures-with-A
検証方法は次のとおりです。
encodingType
ですSystem.Text.Encoding.UTF8
。
結果は無効です。
CAPICOM で再度署名したところ、この場合の署名済みメッセージの長さは、OpenSSL によって作成された署名済みメッセージの長さよりも長いことがわかりました。
私が理解するのを手伝ってください!
c - HashObject を使用した Windows Crypto API CryptEncrypt
私が使用しWindows API CryptEncrypt with CALG_AES_256
ているパスワードを使用して暗号化したい、私が理解していることから
で復号化する必要がありますnodejs crypto
&復号化が成功したopenssl
ことをテストするために encを使用nodejs
しましたが、C コードではメッセージが異なります Windows はハッシュをどのように使用しますか?
c - 秘密鍵で署名し、公開鍵で検証
OpenSSL の rsautl を使用すると、秘密鍵で署名できます。これはハッシュなしです。次に、署名されたファイルを公開鍵で復元します。
見ましたCryptCreateHash/CryptSignHash/CryptHashData
がやり方がわかりません。これらの関数は、データ自体ではなく、データのハッシュにのみ署名すると思います。
ハッシュを使わずに秘密鍵で署名できる方法はありますか?
編集: jww の推奨事項から必要な変更を加えました。
winapi - マシンの RSA キー コンテナーでのキーの列挙が遅い
マシン キー コンテナー内のキーを列挙する必要があります。これは通常、オプションのプロバイダー関数ですが、 と の両方MS_STRONG_PROV
でMS_ENH_RSA_AES_PROV
サポートされています。私は何か間違ったことや異常なことをしているとは思いません: まず、 でコンテキスト ハンドルを取得し、列挙が使い果たされるまで繰り返しCryptAcquireContext(... CRYPT_MACHINE_KEYSET | CRYPT_VERIFYCONTEXT ...)
呼び出します。CryptGetProvParam(... PP_ENUMCONTAINERS ...)
列挙のベンチマークを行うために、コンテキストの取得と解放をループの外に残し、列挙のみを記録し、列挙を 100 回繰り返します。私が気付いたのは、管理者よりも通常のユーザーの方が列挙が大幅に遅いことです。自分自身 (UAC が有効になっている管理者のメンバー) としてテストを実行すると、
ただし、昇格したプロンプトから同じテストを実行すると、結果は劇的に異なります。
内部では、管理者以外のユーザーよりも多くのキーが管理者に報告されますが、これは予想されることであり、正常です。私が理解していないのは、管理者以外のユーザーの列挙が約 40 倍遅い理由です。ポインタはありますか?
テストの完全なソースを Gist に入れています。このテストは、暗号化ハードウェアのない非常に一般的な Windows 7 マシンで実行されます。
追加: Server 2012 HyperV ホスト上の Server 2012 仮想マシンでは、スローダウン係数はさらに大きく、130 を超えました: 440 対 3.3 ミリ秒。確かに、440ms は私にとってパフォーマンスの問題です。
java - Java のエイリアス名に基づいていないキーストアから証明書を取得する
以下のコードを使用して、エイリアス名に基づいてキーストアから証明書を取得しています。
キーストアからではなく、現在のトークンからエイリアスを取得する方法はありますか?
前もって感謝します。
c++ - Microsoft CryptoAPI: PUBLICKEYBLOB を DER/PEM に変換する方法は?
PRIVATEKEYBLOB と PUBLICKEYBLOB として格納された生成された RSA キー ペアがあり、PHP または Python で使用できるように、これらのキーを DER または PEM 形式に変換できる必要があります。CryptEncodeObject 関数を使用して PRIVATEKEYBLOB を DER に変換できることがわかりました。そのためには、PKCS_RSA_PRIVATE_KEY エンコーディング フラグを使用する必要があります。しかし、PUBLICKEYBLOB を DER に変換する方法についての手がかりが見つかりませんでした。
PRIVATEKEYBLOB 変換のコードは次のとおりです。
キーを openssl ツールの出力と比較してテストします。
追加: X509_ASN_ENCODING で RSA_CSP_PUBLICKEYBLOB を試しましたが、結果が openssl ツールの出力と異なり、キーのインポートに失敗します。openssl のエクスポートされた DER は 25 バイト長く、最初の 3 バイトだけが両方のキーで同じです。キー比較の写真は次のとおりです。
この図をよく見ると、openssl のキー バージョンには、3 番目のバイトの後に何らかの追加の 24 バイトのヘッダーがあることがわかります。それが何であるかはまだわかりませんが、このハードコーディングされたヘッダーを、RSA_CSP_PUBLICKEYBLOB を使用して CryptEncodeObject から取得した出力と連結すると、すべて正常に動作します。ただし、そのヘッダーが常に同じかどうかはわかりません。
java - SunMSCAPI が一部のキーストア エントリの秘密鍵を認識しない
長くなってしまい申し訳ありません。Java で client-auth を行うことに慣れている場合は、おそらく一番下までスキップ/スキップできます。さまざまなソースから関連するすべての情報を見つけるのに長い時間がかかりました. 多分これは他の誰かを助けるでしょう。
Windowsキーストアを使用してJavaクライアントからクライアント側認証を機能させるための概念実証に取り組んでいます。クライアント証明書を要求または要求できるサーブレットを作成しました。サブジェクト DN とシリアル番号を含む証明書情報を含む HTML 応答を返すだけです。私はブラウザー (主に Chrome と IE) で多くの実験を行い、それが機能していることを確認しました。SSLで生成した証明書と、会社の内部CAによって発行された証明書の両方を使用して、クライアント認証に成功しました。
私の次のステップは、Java の MSCAPI キーストアで動作する Java クライアントを用意することです。私がこのルートを選んだ理由は、使用したい証明書が内部 CA によって発行され、Windows の個人用キーストアに自動的に追加され、エクスポート不可としてマークされているためです。ワークステーションの管理者であれば、いくつかの無料ツールを使用してキーストアから秘密鍵を取得する方法があることを知っています。この場合、さまざまな理由から、これは実行可能なオプションではありません。これが私が最終的に得たコードです:
これは機能しますが、接続すると、Java クライアントは以前に生成したクライアント証明書で認証されます。特定のキーの選択を強制する明確な方法が見当たらないので、ホストが信頼する最初のキーを選択するだけだと考えました。次に、作成したこれらの証明書を Windows キーストアから削除したところ、認証されなくなりました。サーバー側がまだブラウザーで動作していることをトリプルチェックしましたが、動作します。次に、これらの証明書を個人用キーストアに再度追加し、疑似 CA の信頼をサーバー側から削除しました。クライアントではなくブラウザで引き続き機能します。
-Djavax.net.debug=ssl:handshake を VM パラメータに追加し、出力を調べ始めました。私が見ているのは、追加した証明書ごとに「次のキーが見つかりました:[エイリアス]」という行ですが、certmgr.mscの「自己登録」機能を介して追加されたものではありません。最初はそれらがエクスポート可能だったからだと思っていましたが、それらを削除してエクスポート不可として追加し、Javaはまだそれを使用できます。SunMSCAPI がこれらの証明書を使用しない理由がわかりません。私が作成したものと内部 CA は両方とも sha256RSA です。どちらもクライアント認証が有効になっています。次のコードを追加すると、使用するすべてのキー ペアに対して isKeyEntry() が false であることがわかります。
ここで同様の問題を抱えている人を見つけましたが、決定的な答えはありません。