web-dev-qa-db-ja.com

JavaおよびSSL証明書

PHP私のスクリプトJavaセキュアソケットレイヤー(HTTPS)を使用して)接続を確立しようとしていますが、最大のセキュリティ/有効性ウェブサイトが使用するSSL証明書をアプリケーションにインポートする必要があります...方法がわからない。

それが役立つ場合、SSL証明書は自己署名されておらず、 StartSSL によって提供されています。また、Eclipse IDEを使用しています。

誰かが私を正しい方向に向けることができますか?つまり、どのファイルが必要か、どこにインポートする必要があるか、Javaでどのコードが必要かなどです。

14
Andy

最大のセキュリティ/有効性を確保するために、私のWebサイトが使用するSSL証明書をアプリケーションにインポートする必要があることがわかりました

その発言をするときあなたは部分的に正しいです。 SSL証明書をインポートする必要はありません。 StartSSL CA証明書をインポートするだけで十分です。

さらに、Javaアプリケーションに証明書をインポートするようなものはありません。 JavaでのSSLサポートは、アプリケーション内にパッケージ化されている一部の証明書ではなく、キーストアとトラストストアの概念に依存しています。エンドユーザーがダウンロードして実行するアプリケーションを公開する場合は、証明書を公開する必要はなく、アプリケーションの秘密鍵も公開する必要はありません。秘密鍵と関連する証明書は、あなただけがアクセスできる鍵ストアに保管されます。

アプリケーションのエンドユーザーはJavaランタイム内のSSLサポートに依存しているため、サーバー証明書が検証された後、アプリケーションはサイトへのSSL接続を確立できます。 Javaランタイムには、トラストストアにデフォルトのCA証明書セットが付属しており、SSL接続が正常に確立されるための唯一の前提条件は、サーバーのSSL証明書がトラストストア内のいずれかのCAによって発行されることです。 。 StartSSLの証明書がJavaランタイムのトラストストアに存在しません 、少なくともバージョン6以降、したがって:

  • StartSSL CA証明書をJavaトラストストアにインポートするアクティビティを実行するようにエンドユーザーに指示できます。役立つ可能性のあるリンクには、 このStartSSLフォーラムスレッド (CA証明書をトラストストアにインポートするために必要な最初の4つのステップのみ)、 GitHubプロジェクト 、および このブログ投稿 ;免責事項-私はそれらのいずれも使用しようとしたことがなく、あなたはあなた自身の責任でそれを使用するべきです。
  • または、-Djavax.net.ssl.trustStore=<path_to_truststore> -Djavax.net.ssl.trustStorePassword=<truststore_password> JVM起動フラグを使用して独自のトラストストアでアプリケーションを初期化するか、SSL接続を初期化する前に次のコードを実行します。

    System.setProperty("javax.net.ssl.trustStore","<path_to_truststore>");
    System.setProperty("javax.net.ssl.trustStorePassword","<truststore_password>");
    

    これが実行可能なアプローチであるのは、アプリケーションがJava SEアプリケーションで、たまたまアプレットではない(またはトラストストアの指定方法に同様の制限があるアプリケーション)場合のみです。


Java keytoolのドキュメント を読むことも役立ちます。

29
Vineet Reynolds

どうやらメールガンエンジニアは何らかの理由で、これを解決する方法について明確な指示を与えたくないようです。これは私がやったことです

Tomcat8を実行し、ジャージーWebサービスを介してmailgun APIに接続します。私はこのユーザーの指示に従いましたが、うまくいきました。これが誰かを助けることを願っています。

1/22に、SymantecのPKIインフラストラクチャが信頼できないように設定されたため、SSL証明書を更新しました。一部の古いバージョンのJavaには、「DigiCert Global Root G2」CAがありません。

いくつかのオプションがあります:

「DigiCert Global Root G2」CAを「cacerts」ファイルにインポートします。 JREをこのルートを含む8u91(またはそれ以上)にアップグレードします。 「DigiCertグローバルルートG2」をインポートするにはルートは https://www.digicert.com/digicert-root-certificates.htm からダウンロードできます。正しいルート証明書をダウンロードしていることを確認してください。

証明書をダウンロードしたら、次のようなコマンドでにインポートする必要があります。

keytool -import -trustcacerts -keystore/path/to/cacerts -storepass changeit -noprompt -alias digicert-global-root-g2 -file /path/to/digicert.crt Javaキーストアとダウンロードしたルート証明書の場所。


したがって、1。/path/to/digicert.crtは、ダウンロードしたファイルです。 2./path/to/cacerts-これはJREパスにあります。 「/ -name cacerts -print」を検索すると、ファイルシステム上のすべてのJava cacertsをすばやく見つけることができます。私にとっては/ usr/lib/jvm/Java-7-openjdk-AMD64/jre/lib/security/cacertsでした

2
Will Berger

次のメソッドは、デフォルトの(cacerts)キーストアをロードし、証明書がインストールされているかどうかを確認し、インストールされていない場合はインストールします。これにより、任意のサーバーでkeystoreコマンドを手動で実行する必要がなくなります。

デフォルトのキーストアパスワード(changeit)が変更されていないことを前提としています。更新CACERTS_PASSWORDない場合。このメソッドは、証明書を追加した後にキーストアを保存するため、一度実行すると、証明書はストアに永続的に保存されます。

import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileNotFoundException;
import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.net.MalformedURLException;
import Java.net.URL;
import Java.security.KeyStore;
import Java.security.KeyStoreException;
import Java.security.NoSuchAlgorithmException;
import Java.security.cert.Certificate;
import Java.security.cert.CertificateException;
import Java.security.cert.CertificateFactory;

/**
 * Add a certificate to the cacerts keystore if it's not already included
 */
public class SslUtil {
    private static final String CACERTS_PATH = "/lib/security/cacerts";

    // NOTE: DO NOT STORE PASSWORDS IN PLAIN TEXT CODE, LOAD AT RUNTIME FROM A SECURE CONFIG
    // DEFAULT CACERTS PASSWORD IS PROVIDED HERE AS A QUICK, NOT-FOR-PRODUCTION WORKING EXAMPLE
    // ALSO, CHANGE THE DEFAULT CACERTS PASSWORD, AS IT IMPLORES YOU TO!
    private static final String CACERTS_PASSWORD = "changeit";

    /**
     * Add a certificate to the cacerts keystore if it's not already included
     * 
     * @param alias The alias for the certificate, if added
     * @param certInputStream The certificate input stream
     * @throws KeyStoreException
     * @throws NoSuchAlgorithmException
     * @throws CertificateException
     * @throws IOException
     */
    public static void ensureSslCertIsInKeystore(String alias, InputStream certInputStream)
            throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException{
        //get default cacerts file
        final File cacertsFile = new File(System.getProperty("Java.home") + CACERTS_PATH);
        if (!cacertsFile.exists()) {
            throw new FileNotFoundException(cacertsFile.getAbsolutePath());
        }

        //load cacerts keystore
        FileInputStream cacertsIs = new FileInputStream(cacertsFile);
        final KeyStore cacerts = KeyStore.getInstance(KeyStore.getDefaultType());
        cacerts.load(cacertsIs, CACERTS_PASSWORD.toCharArray());
        cacertsIs.close();

        //load certificate from input stream
        final CertificateFactory cf = CertificateFactory.getInstance("X.509");
        final Certificate cert = cf.generateCertificate(certInputStream);
        certInputStream.close();

        //check if cacerts contains the certificate
        if (cacerts.getCertificateAlias(cert) == null) {
            //cacerts doesn't contain the certificate, add it
            cacerts.setCertificateEntry(alias, cert);
            //write the updated cacerts keystore
            FileOutputStream cacertsOs = new FileOutputStream(cacertsFile);
            cacerts.store(cacertsOs, CACERTS_PASSWORD.toCharArray());
            cacertsOs.close();
        }
    }
}

次のように使用します。

SslUtil.ensureSslCertIsInKeystore("startssl", new FileInputStream("/path/to/cert.crt"));
1
Shane

その記事には、トラストストアのパスワードを変更し、そこに他の証明書を追加するためのコードが含まれています。

thetechawesomeness.ideasmatter.info

0

最大のセキュリティ/有効性を確保するために、SSL証明書をインポートする必要があることがわかりました

いいえ、必要ありません。クライアントがサーバー証明書の署名者をまだ信頼していない場合にのみ、この手順が必要です。これは、サーバー証明書が自己署名または署名されている場合にのみ発生します。内部CAによって。

0
user207421

次の記事をご覧ください。 http://stilius.net/Java/java_ssl.php コードからスクリプトにアクセスしようとしている場合に役立つコード例が含まれています。

システムプロパティを使用する必要があることに注意してください

javax.net.ssl.keyStore
javax.net.ssl.keyStorePassword

keytool ツールを使用して、SSL証明書をJVMに渡すか、JREキーストアにインポートします

0
Sergey