14

実行時にキーストアを変更することは可能ですか? 現在、server.start() を実行する前に SSL をセットアップしています -

sslContextFactory.setTrustStore(ks);
sslContextFactory.setTrustStorePassword(TRUSTSTORE_PASS);
sslContextFactory.setKeyStorePassword(KEYSTORE_PASS); 
ServerConnector https = new ServerConnector(server, sslContextFactory);

server.start()

私がやりたいのは、実行時に証明書を作成して使用することです。基本的に、その場で証明書を作成する Fiddler のようなツールを作成しています。

4

5 に答える 5

6

これは Jetty 9.4.0 以降で修正されています。 https://github.com/eclipse/jetty.project/issues/918を参照してください。Key/TrustStore などをオーバーライドして を呼び出すだけSslContextFactory.reloadです。

ただし、TLS セッションの再開には注意点があります: https://github.com/eclipse/jetty.project/issues/918#issuecomment-250791417。コメントによると、一般的なブラウザーでは問題にならないはずですが、IE、モバイル、ブラウザー以外のクライアントなどについて知っている人はいません。

于 2017-03-26T21:13:11.313 に答える
0

私は Java のセキュリティ パッケージの専門家ではありませんが、私の知る限り、パブリック API からキーペアを作成する簡単な方法はありません。

ただし、次のような Sun の制限付きパッケージからのインポートをコードに許可していただければ可能です。

import sun.security.x509.*;

探しているコードの概要は次のとおりです。

PrivateKey privkey = pair.getPrivate();
X509CertInfo info = new X509CertInfo();
Date from = new Date();
//Validity for next one year
Date to = new Date(from.getTime() + (365) * 86400000l);

CertificateValidity interval = new CertificateValidity(from, to);

BigInteger sn = new BigInteger(64, new SecureRandom());
X500Name owner = new X500Name(dn);

info.set(X509CertInfo.VALIDITY, interval);
info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
info.set(X509CertInfo.KEY, new CertificateX509Key(pair.getPublic()));
info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
AlgorithmId algo = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algo));

// Sign the cert
X509CertImpl cert = new X509CertImpl(info);
cert.sign(privkey, algorithm);

//cert object is ready to use

お役に立てれば

于 2013-06-08T09:52:22.133 に答える
0

ここには 2 つの問題があるようです: 動的に証明書を生成すること (「実行時に証明書を作成して使用したい」) と、再起動せずにセットアップすること (「実行時にキーストアを変更することは可能ですか? 」 ?」)。

  • 証明書を動的に生成するには、BouncyCastle とそのX509V3CertificateGeneratorクラスを使用できます。

    • まず、たとえばkeytoolを使用して、自己署名 CA を (CA の基本的な制約セットを使用して) 生成します (詳細については、-extオプションを参照してください)。これがカスタム CA になります。

    • そのキーストアから証明書をエクスポートし (秘密鍵ではなく、CA 証明書のみ)、使用するクライアントにインポートします。

    • アプリケーションで、その秘密鍵を使用して署名し、X509V3CertificateGenerator使用する発行者 DN が上記で生成した CA 証明書のサブジェクト DN と一致することを確認します。

    • 次に、クライアントが接続しようとしているホスト名と一致するサブジェクト DN (またはサブジェクトの別名) を使用して証明書生成を構成する必要があります。ある種の透過プロキシとしてこれを自動的に行う場合、これはややこしいかもしれません。(私の知る限り、Java の現在のバージョンは、SNI 拡張からの名前を読み取ることができません。少なくとも、事前に、または手動で処理を行わなければ、より簡単な方法は、このホスト名を構成可能なものにすることです。ツールのオプション。

  • サーバーを再起動せずにセットアップするには、使用X509KeyManagerしている場所にとどまる独自のものを実装できSSLContextますが、後で証明書を再構成するための参照とカスタムアクセサーを保持します。確かに、必ずしも「クリーン」であるとは限りません。私は試していませんが、原則として機能するはずです。(並行性の側面が適切に処理されていることを確認する必要があります。)

    これにより、リッスンしているソケットをシャットダウンし、再構成してソケットSSLContextを再起動する必要がなくなる場合があります。いずれにせよ (ホスト名を再構成するために) アプリケーションとやり取りする必要があるかもしれないことを考えると、これはやり過ぎかもしれません。

于 2013-06-12T14:30:48.960 に答える