は、私は、サーバーへのSSLたっを作成しようとしています。 Truststoreを作成し、サーバの証明書をインポートし、信頼できるエントリとして私の鍵ストアをキーストアにインポートしました。サーバーのメンバーは、自分の証明書をキーストアにインポートしています。しかし、私が接続しようとすると、私はこのエラーを取得:受信致命的な警告、bad_certificate
Received fatal alert: bad_certificate
サーバーでは、彼らはこのエラーを取得しています
javax.net.ssl.SSLHandshakeException: null cert chain
私は多分、私がどのように修正すればよい?、間違っていることが何ができますかこのエラー?私は今この問題を非常に長い間戦ってきました。
私のクライアントコード
import java.io.*;
import java.net.*;
import java.security.*;
import java.util.Enumeration;
import javax.net.ssl.*;
public class SSLConnect {
public String MakeSSlCall(String meternum) {
String message = "";
FileWriter file = null;
try {
file = new FileWriter("C:\\SSLCERT\\ClientJavalog.txt");
} catch (Exception ee) {
message = ee.getMessage();
}
//writer = new BufferedWriter(file);
try {
file.write("KeyStore Generated\r\n");
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(new FileInputStream("C:\\SSLCERT\\newclientkeystore"), "client".toCharArray());
file.write("KeyStore Generated\r\n");
Enumeration enumeration = keystore.aliases();
while (enumeration.hasMoreElements()) {
String alias = (String) enumeration.nextElement();
file.write("alias name: " + alias + "\r\n");
keystore.getCertificate(alias);
file.write(keystore.getCertificate(alias).toString() + "\r\n");
}
TrustManagerFactory tmf =TrustManagerFactory.getInstance("SunX509");
tmf.init(keystore);
file.write("KeyStore Stored\r\n");
SSLContext context = SSLContext.getInstance("SSL");
TrustManager[] trustManagers = tmf.getTrustManagers();
context.init(null, trustManagers, null);
SSLSocketFactory f = context.getSocketFactory();
file.write("About to Connect to Ontech\r\n");
SSLSocket c = (SSLSocket) f.createSocket("192.168.1.16", 4447);
file.write("Connection Established to 196.14.30.33 Port: 8462\r\n");
file.write("About to Start Handshake\r\n");
c.startHandshake();
file.write("Handshake Established\r\n");
file.flush();
file.close();
return "Connection Established";
} catch (Exception e) {
try {
file.write("An Error Occured\r\n");
file.write(e.getMessage() + "\r\n");
file.flush();
file.close();
} catch (Exception eee) {
message = eee.getMessage();
}
return "Connection Failed";
}
}
}
keytoolは
のkeytool -import -aliasクライアント-file client.cer -keystore MyKeystore -storepassディレクトリのmystore
のkeytool -import -alias私のトラストストアを作成するためのコマンドserver-file server.cer -keystore MyKeystore -storepass mystore
また、2つの証明書を私のcacertsキーストアに追加しました。
ここでは、接続に使用するコード、トラストストアの作成、および証明書のインポートのためのコードを記述してください。ところで、必要なサーバーの証明書をインポートしたことはありますか? – Gangnus
@Gangnus自分の証明書を格納するためのコードとkeytoolコマンドを追加しました。私がここで間違っていることは何ですか? –
私は質問の可能な終了を判断するように招待されました。ほとんどの場合、コードなしの質問は役に立たないと考えられます。そしてあなたの場合、それは本当にそうでした。閉鎖に対する投票があなたのファーストエディションによってサポートされたことをうれしく思っています。私はまた、コードが失敗する場所をマークすることをお勧めします。ソケット作成またはハンドシェイク?また、例外からスタックトレースを取得する必要があります。そしておそらく、ソケット 'c'の内容は、失敗の前後にあります。あなたのスタイルに関しては、私はその 'ファイル'の代わりにロガーを使うことをお勧めします。そして、名前 'c'はあまりにも分かりません。 – Gangnus