0

この質問は、PEMファイルを使用してJavaでSSLソケットを作成する方法に似ていますか?しかし、私はその質問から提案された解決策を機能させることができないようです。以前は.NetWebサービスに接続できましたが、証明書を介してSLLが実装されたため、アクセスできなくなりました。サーバーチームから、Webサービスに再度接続できるようにする証明書が提供されました。そして、私はこれがcurlを使用して機能していることを確認しました:

curl -E cer_file.pem:password https://hostname/servicename.svc?wsdl

したがって、上記はwsdlを正しく返します。このメッセージを回避するために、curl呼び出しが正しく機能するように.cacert.pemファイルを作成する必要がありました(curl:(77)証明書検証場所の設定エラー):

curl http://curl.haxx.se/ca/cacert.pem > .cacert.pem
export SSL_CERT_FILE=/Users/jcran/.cacert.pem

現在、以下のJavaを使用しようとすると、まだ403が発生します。私が間違っていることを誰かが見つけられるかどうか疑問に思っていました。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSocketFactory;


public class TestSSL {

private static final String WS_URL 
    = "https://hostname/servicename.svc?wsdl";
private static final String KS_FILE 
    = "C:/tstfolder/client_side_keystore.jks";
private static final String TS_FILE 
    = "C:/tstfolder/curl_trusted_ca.jks";

public static void main(String... args) throws Exception {
    testConn();
}

public static void testConn() throws Exception {
    System.setProperty("javax.net.ssl.keyStore", KS_FILE);
    System.setProperty("javax.net.ssl.keyStoreType", "jks");
    System.setProperty("javax.net.ssl.keyStorePassword", "importkey");
    System.setProperty("javax.net.ssl.trustStoreType", "jks");
    System.setProperty("javax.net.ssl.trustStore", TS_FILE);
    System.setProperty("javax.net.ssl.trustStorePassword", "password");
    System.setProperty("javax.net.debug", "all");

    SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
    URL url = new URL(WS_URL);
    HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
    conn.setSSLSocketFactory(sslsocketfactory);

    InputStream inputstream = conn.getInputStream();
    InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
    BufferedReader bufferedreader = new BufferedReader(inputstreamreader);


    String string = null;
    while ((string = bufferedreader.readLine()) != null) {
        System.out.println("Received " + string);
    }
}
}

以下は、トラストストアとキーストアを作成するために使用した手順です。cer_file.pemを個別のcert.pemとkey.pemに分割します。次に、次のリンクhttp://www.agentbob.info/agentbob/79-AB.htmlの指示を使用して、client_side_keystore.jksを作成しました。次に、 http: //code.google.com/p/java-keyutil/にあるユーティリティを使用してcurl certsファイルをjksにインポートすることにより、トラストストアを作成しました。

残念ながら、Javaテストクラスを介してwsdlを読み取ろうとすると、403が返されます。これはcurl呼び出しを介して機能します。私は何か馬鹿げたことをしているのではないか、あるいは何かを誤解しているのではないかと思います。しかし、誰かが私を正しい方向に向けることができるかどうか疑問に思っていましたか?

4

1 に答える 1

1

キーストアが正しく変換されていないようです。

OpenSSLから直接PKCS#12ファイルを作成する方が簡単な場合があります。

openssl pkcs12 -export -in file.crt -inkey file.key -out file.p12

次に、PKCS12キーストアタイプとして直接使用します(またはを使用してJKSに変換しますkeytool)。

ここで説明するように、中間証明書がある場合は、チェーンが正しいことを確認することをお勧めします。

于 2012-11-16T16:40:35.907 に答える