Java コード署名証明書は SSL 証明書と同じですか?
-
09-06-2019 - |
解決
短い答え:いいえ、違います。
長い答え:これは同じ種類の証明書であり、同じ暗号化ソフトウェアを使用しますが、証明書には使用が許可されている内容を示すフラグが付いています。コード署名と Web サーバーは異なる用途です。
他のヒント
Firefox (など) で新しい CA 証明書をインポートするとき、どの証明書を信頼するかを選択するオプションがあります。
- 署名サーバー
- 署名コード (アプレットなど)
- 電子メール証明書に署名する
したがって、私にとっての答えは次のとおりです。はい、同じです。さらに、独自のものを生成してみてはいかがでしょうか OpenSSL (男性 openssl、男性 x509、男性 req などUnix では)?警告を静かにしたいですか または 欲しいですか 他の 会ったこともない人があなたのコードを信頼するでしょうか?他のユーザーがブラウザーや OS などにバンドルされているアンカー CA に信頼をチェーンする必要がない場合は、OpenSSL を使用して独自の CA を生成します。
「OpenSSLを使用して自分の証明書を生成するにはどうすればよいですか?」と尋ねます。後者があなたの選択である場合。
Thawte はコード署名証明書を提供します ここ. 。他の認証局も同様にこのサービスを提供していると思います。自己署名証明書を作成することもできます。 Java キーツール.
X.509 証明書には以下が含まれる場合があります 主要な使用法フィールド (KUさん)と 拡張キー使用フィールド (EKUのもの)。の RIA の署名を作成する方法を説明する Oracle テクニカル ノート キー使用フラグなしで証明書を作成しますが、これは問題なく機能します (信頼できる CA に署名してもらうことができれば)
しかし、CA はこれらの鍵使用フィールドを含む証明書を発行することが増えています。これらのフィールドが存在する場合、 制限 証明書の使用法。Java プラグインは、これらのフィールドがファイル内に存在するかどうかを確認します。 エンドエンティティチェッカー:
/**
* Check whether this certificate can be used for code signing.
* @throws CertificateException if not.
*/
private void checkCodeSigning(X509Certificate cert)
throws CertificateException {
Set<String> exts = getCriticalExtensions(cert);
if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
throw new ValidatorException
("KeyUsage does not allow digital signatures",
ValidatorException.T_EE_EXTENSIONS, cert);
}
if (checkEKU(cert, exts, OID_EKU_CODE_SIGNING) == false) {
throw new ValidatorException
("Extended key usage does not permit use for code signing",
ValidatorException.T_EE_EXTENSIONS, cert);
}
if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_SSL_CLIENT)) {
throw new ValidatorException
("Netscape cert type does not permit use for SSL client",
ValidatorException.T_EE_EXTENSIONS, cert);
}
// do not check Netscape cert type for JCE code signing checks
// (some certs were issued with incorrect extensions)
if (variant.equals(Validator.VAR_JCE_SIGNING) == false) {
if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_CODE_SIGNING)) {
throw new ValidatorException
("Netscape cert type does not permit use for code signing",
ValidatorException.T_EE_EXTENSIONS, cert);
}
exts.remove(SimpleValidator.OID_NETSCAPE_CERT_TYPE);
}
// remove extensions we checked
exts.remove(SimpleValidator.OID_KEY_USAGE);
exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE);
checkRemainingExtensions(exts);
}
チェック方法は次のようになります。
/**
* Utility method checking if the extended key usage extension in
* certificate cert allows use for expectedEKU.
*/
private boolean checkEKU(X509Certificate cert, Set<String> exts,
String expectedEKU) throws CertificateException {
List<String> eku = cert.getExtendedKeyUsage();
if (eku == null) {
return true;
}
return eku.contains(expectedEKU) || eku.contains(OID_EKU_ANY_USAGE);
}
したがって、KU または EKU が指定されていない場合、KU または EKU チェッカーは喜んで true を返します。
しかし
- KU が指定されている場合、 デジタル署名 KUもそのうちの1人になるはずだ。
- EKU が指定されている場合は、EKU のいずれかが指定されます。 コードサイニング (oid 1.3.6.1.5.5.7.3.3 で識別) または EKU あらゆる用途 (oid 2.5.29.37.0 で識別される) も指定する必要があります。
最後に、 checkRemainingExtensions
メソッドは、残りの重要な EKU をチェックします。存在を許可される他の重要な EKU は次のとおりです。
- 基本的な制約 (oid "2.5.29.19") および
- 件名の代替名 (oid 2.5.29.17)
他の重要な EKU が見つかった場合は、false を返します。