4

プロバイダーから 2 つの証明書ファイルを取得しました。1 つは .cer 形式で、もう 1 つは .p7b 形式です。次に、p7b 証明書を p12 証明書に変換しました。この証明書を使用すると、ブラウザから wsdl に接続できます。次に、このサイトで見つけたいくつかの手順を使用して、その証明書を .pem 形式に変換しました。

openssl pkcs12 -clcerts -nokeys -out test.pem -in mycert.p12
openssl pkcs12 -nocerts -out key.pem -in mycert.p12

次に、次のコマンドを使用して証明書とキーを組み合わせます。

cat test.pem key.pem > cert.pem

Web サービス クラスの構成は次のとおりです。

public function __construct() {
    $wsdl_url = 'https://url.to/web_service?wsdl';
    $pass = 'passphrase';
    $cert = 'cert.pem';

    try {
        $this->client = new SoapClient($wsdl_url, array('local_cert' => $cert, 'passphrase' => $pass));
    } catch(SoapFault $e) {
        print_r($e);
    }
}

そして、ここにエラーがあります:

SSL operation failed with code 1. OpenSSL Error messages: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca in /var/www/html/..

以下を使用して証明書を検証しようとしています:

openssl verify cert.pem

次のエラーが表示されます。

error 20 at 0 depth lookup:unable to get local issuer certificate

また、次の openssl コマンドを使用して .pem-certificate を作成しようとしました。

openssl pkcs12 -in mycert.p12 -out mycert.pem

これを確認すると問題ありませんが、PHP で次のエラーが表示されます。

Unable to set local cert chain file `mycert.pem'; Check that your cafile/capath settings include details of your certificate and its issuer

.p12-certificate. しかし、どのように進めるべきかについての解決策を見つけることができません。前もって感謝します。

4

2 に答える 2

0

ご提供いただいた証明書を発行したルート証明書が見つからないと考えております。

証明書は通常、署名機関によって署名および発行され、クライアントは署名機関の公開鍵を知っている必要があります。証明書が自己署名証明書である場合は問題ありません。

チェックする openssl x509 -text -noout -in key.pem

出力を確認し、発行者を探します。発行者が証明書の CN と同じでない場合は、証明書を提供した署名機関からのルート証明書が必要です。

通常、ブラウザを使用して wsdl アドレスを開き、証明書チェーンを確認して、階層タブからルート証明書をエクスポートすることで取得できます。

あなたの状況でどこに保存するかはわかりませんが、何らかのタイプのトラストストアを指すものがあります.

于 2010-10-29T07:32:44.820 に答える
0

ここでいくつかの問題があると思います。まず、ローカル証明書のオプションが SoapClient オブジェクトのコンストラクターによって使用されているとは思いません。options 配列は、SSL 構成オプションをサポートしていません。第 2 に、SoapClient に指定しているオプションが使用されていない場合、Open SSL は、リモート ホストの証明書が自己認証証明書であると不平を言っています。

これを回避することは可能だと思いますが、コードをいじらないと、すべてのオプションについて確信が持てません。必要な SSL オプションを設定するには、stream_context_create() を使用してカスタム ストリーム コンテキストを作成する必要があると思います ( http://ca.php.net/stream_context_createと SSL のコンテキスト オプションを参照してください)。これは、config 配列の stream_context オプションとして SoapClient オブジェクトに渡すことができます。stream_context を使用して、必要なさまざまな SSL オプションを設定できます。これらはデフォルトを上書きします。

申し訳ありませんが、設定する必要があるオプションについてこれ以上正確に説明することはできません。うまくいけば、ストリーム コンテキストをいじって問題を解決できます。

于 2010-09-27T16:37:46.837 に答える