0

OpenID4Javaを使用して独自のOpenIDプロバイダーで認証しようとするgrailsアプリケーションがあります。

プロバイダーが提示するRapidSSLからの証明書は、GeoTrustGlobalによって署名されています。

ブラウザは証明書を自動的に受け入れます。

私はMacを使用していて、GeoTrustGlobalCAをcacertsに追加しようとすると、とにかくもう一度追加/Library/Java/Home/lib/security/cacertsしたプロンプトが表示されます。Certificate already exists in keystore under alias <keychainrootca-132>

STS内でgrailsを開始する-Djavax.net.debug=ssl run-app -https

出力には次のようなものがあります。

adding as trusted cert:
  Subject: CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
  Issuer:  CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
  Algorithm: RSA; Serial number: 0x23456
  Valid from Tue May 21 14:00:00 EST 2002 until Sat May 21 14:00:00 EST 2022

adding as trusted cert:
  Subject: CN=GeoTrust Primary Certification Authority, O=GeoTrust Inc., C=US
  Issuer:  CN=GeoTrust Primary Certification Authority, O=GeoTrust Inc., C=US
  Algorithm: RSA; Serial number: 0x18acb56afd69b6153a636cafdafac4a1
  Valid from Mon Nov 27 11:00:00 EST 2006 until Thu Jul 17 09:59:59 EST 2036

ただし、アプリケーションからサービスにアクセスしようとすると、次のようになります。

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
  at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
  at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
  at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:339)
  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123)
  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147)
  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:101)
  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:381)
  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
  at org.openid4java.util.HttpCache.head(HttpCache.java:335)
  at org.openid4java.discovery.yadis.YadisResolver.retrieveXrdsLocation(YadisResolver.java:400)
  at org.openid4java.discovery.yadis.YadisResolver.discover(YadisResolver.java:248)
  at org.openid4java.discovery.yadis.YadisResolver.discover(YadisResolver.java:232)
  at org.openid4java.discovery.yadis.YadisResolver.discover(YadisResolver.java:166)
  at org.openid4java.discovery.Discovery.discover(Discovery.java:147)
  at org.openid4java.discovery.Discovery.discover(Discovery.java:129)
  at org.openid4java.consumer.ConsumerManager.discover(ConsumerManager.java:542)
  at org.openid4java.consumer.ConsumerManager$discover.call(Unknown Source)
4

2 に答える 2

0

次の行に沿って追加のApacheディレクティブを使用して問題を解決しました

SSLCertificateChainFile /etc/pki/tls/certs/intermediate.crt

発行者が誰であるかという理由で、中間CAエントリが必要だったようです。

于 2012-05-16T00:17:41.153 に答える
0

証明書チェックをバイパスして問題を解決しました。ConsumerManagerオブジェクトを新しく作成するときは、デフォルトのコンストラクターを使用しないでください。サンプルコードはこちらです:

private ConsumerManager getFreeHttpsManager() throws NoSuchAlgorithmException, KeyManagementException {
    //ignore all
    TrustManager trm = new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public void checkClientTrusted(X509Certificate[] certs, String authType) {

        }

        public void checkServerTrusted(X509Certificate[] certs, String authType) {
        }
    };

    SSLContext sc = SSLContext.getInstance("TLS");
    sc.init(null, new TrustManager[]{trm}, null);
    //  HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    X509HostnameVerifier verifier = new X509HostnameVerifier() {

        @Override
        public void verify(String string, SSLSocket ssls) throws IOException {
        }

        @Override
        public void verify(String string, X509Certificate xc) throws SSLException {
        }

        @Override
        public void verify(String string, String[] strings, String[] strings1) throws SSLException {
        }

        @Override
        public boolean verify(String string, SSLSession ssls) {
            return true;
        }
    };
    Discovery discovery = new Discovery();
    discovery.setYadisResolver(new YadisResolver(new HttpFetcherFactory(sc, verifier)));
    return new ConsumerManager(
            new RealmVerifierFactory(new YadisResolver(new HttpFetcherFactory(sc, verifier))),
            discovery,  // uses HttpCache internally
            new HttpFetcherFactory(sc, verifier));
}
于 2014-01-23T02:26:11.207 に答える