5

リモートサーバーから機密データを要求するphpスクリプトを書いています。私はcURLを使用してリモートサーバーの証明書情報を取得しています(その出力については以下をご覧ください)。

誰もそれらを偽装できないように、証明書の有効性をチェックする必要があるアレイキーはどれですか?

たとえば、キー[certinfo] [0] [Subject] [CN]は、自己署名証明書によってスプーフィングされる可能性があります。

クライアント側で使用しているca-bundleファイルのmd5ファイルハッシュを確認することもできますが、サーバーの証明書が期限切れになると、それに応じてca-bundleファイルを置き換え、phpスクリプトでmd5ファイルハッシュを更新する必要があります-これは受け入れられません私のため。唯一の黙認は、phpスクリプトを更新せずにca-bundleファイルを置き換えることです。そのためには、サーバーの証明書の属性を検証する必要があります。これは、将来の証明書の再生成を通じて同じままであり、悪意のあるユーザーによってスプーフィングされることはありません。

print_r(curl_getinfo($ ch)):

[url] => https://remoteserver.com
[content_type] => text/html
[http_code] => 200
[header_size] => 148
[request_size] => 79
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.374
[namelookup_time] => 0
[connect_time] => 0.062
[pretransfer_time] => 0.203
[size_upload] => 0
[size_download] => 20618
[speed_download] => 55128
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => 0
[starttransfer_time] => 0.281
[redirect_time] => 0
[certinfo] => Array
    (
        [0] => Array
            (
                [Subject] => Array
                    (
                        [OU] => Globe Standard SSL
                        [CN] => www.remoteserver.com
                    )

                [Issuer] => Array
                    (
                        [C] => US
                        [O] => Globe Hosting, Inc.
                        [OU] => GlobeSSL DV Certification Authority
                        [CN] => GlobeSSL CA
                    )

                [Version] => 2
                [Signature Algorithm] => sha1WithRSAEncryption
                [Start date] => 2011-09-30 00:00:00 GMT
                [Expire date] => 2014-09-30 23:59:59 GMT
                [Public Key Algorithm] => rsaEncryption
                [RSA Public Key] => 2048
                [rsa(n)] => d7:c0:0b:3f:f3:3e:d6:ed:92:56:22:12:64:c1:c4:00:d7:c9:a1:1e:..cut..
                [rsa(e)] => 01:00:01:
                [X509v3 Authority Key Identifier] => keyid:C3:AB:A0:02:F0:9B:F5:66:7F:28:15:92:22:95:DB:B8:4E:D3:93:08
                [X509v3 Subject Key Identifier] => 13:1B:B2:52:14:3C:70:1C:B2:93:F1:C5:04:06:86:60:8A:D4:E5:5C
                [X509v3 Key Usage] => DigitalSignature,KeyEncipherment
                [X509v3 Basic Constraints] => CA:FALSE
                [X509v3 Extended Key Usage] => TLSWebServerAuthentication,TLSWebClientAuthentication
                [X509v3 Certificate Policies] => Policy:1.3.6.1.4.1.6449.1.2.2.27, CPS:http://www.globessl.com/docs/GlobeSSL_CPS.pdf
                [X509v3 CRL Distribution Points] => URI:http://crl.globessl.com/GlobeSSLDVCertificationAuthority.crl
                [Authority Information Access] => CAIssuers-URI:http://crt.globessl.com/GlobeSSLDVCertificationAuthority.crt, OCSP-URI:http://ocsp.globessl.com
                [X509v3 Subject Alternative Name] => DNS:www.remoteserver.com,DNS:remoteserver.com
                [Signature] => 61:38:06:d4:30:9c:14:a4:e5:1e:b2:c8:c4:..cut..
                [Cert] => -----BEGIN CERTIFICATE-----cut-----END CERTIFICATE-----

            )

        [1] => Array
            (
                [Subject] => Array
                    (
                        [C] => US
                        [O] => Globe Hosting, Inc.
                        [OU] => GlobeSSL DV Certification Authority
                        [CN] => GlobeSSL CA
                    )

                [Issuer] => Array
                    (
                        [C] => SE
                        [O] => AddTrust AB
                        [OU] => AddTrust External TTP Network
                        [CN] => AddTrust External CA Root
                    )

                [Version] => 2
                [Signature Algorithm] => sha1WithRSAEncryption
                [Start date] => 2010-06-22 00:00:00 GMT
                [Expire date] => 2020-05-30 10:48:38 GMT
                [Public Key Algorithm] => rsaEncryption
                [RSA Public Key] => 2048
                [rsa(n)] => a0:47:04:ce:a8:33:ab:..cut..
                [rsa(e)] => 01:00:01:
                [X509v3 Authority Key Identifier] => keyid:AD:BD:98:7A:34:B4:26:F7:FA:C4:26:54:EF:03:BD:E0:24:CB:54:1A
                [X509v3 Subject Key Identifier] => C3:AB:A0:02:F0:9B:F5:66:7F:28:15:92:22:95:DB:B8:4E:D3:93:08
                [X509v3 Key Usage] => CertificateSign,CRLSign
                [X509v3 Basic Constraints] => CA:TRUE,pathlen:0
                [X509v3 Certificate Policies] => Policy:1.3.6.1.4.1.6449.1.2.2.27
                [X509v3 CRL Distribution Points] => URI:http://crl.usertrust.com/AddTrustExternalCARoot.crl
                [Authority Information Access] => CAIssuers-URI:http://crt.usertrust.com/AddTrustExternalCARoot.p7c, CAIssuers-URI:http://crt.usertrust.com/AddTrustUTNSGCCA.crt, OCSP-URI:http://ocsp.usertrust.com
                [Signature] => 66:9c:13:6d:d2:7e:2c:..cut..
                [Cert] => -----BEGIN CERTIFICATE-----cut-----END CERTIFICATE-----

            )

    )

助けてくれてありがとう。

4

2 に答える 2

1
$ch=curl_init("https://default_cert");
curl_setopt($ch, CURLOPT_CAINFO, getcwd().'mydefault.cert');
curl_setopt ($ch,CURLOPT_CERTINFO,1);
curl_setopt ($ch,CURLOPT_VERBOSE,1);
curl_exec($ch) or die;
print_r( curl_getinfo($ch) );

この場合、mydefault.cert に誤った CN が含まれていると、curl exec が失敗するか、中間者によって証明書がスプーフィングされます。

mydefault.cert には、リモート ホストの証明書が含まれている必要があります。信頼されたチャネルを使用して取得する必要があります (または、現時点でリモート ホストが信頼されていることが確実CURLOPT_SSL_VERIFYPEER,FALSEな場合は、少なくとも 1 回ダウンロードしてください)。

いくつかの理論:

  • 自己署名された証明書と自己署名されていない証明書の違いは次のとおりです。自己署名された証明書は、自分自身のために人によって発行され、鍵と証明書の部分がありますが、自己署名されていない証明書は、信頼できる誰かによって署名されています。それは認定センター、親友、上司などです。あなたの親友が自己署名証明書を発行し、承認された方法で証明書を取得した場合 (彼はディスケットであなたに渡すか、独自の pgp キーを使用して手紙に署名するか、証明書の途中から 20 文字を伝えました)、それを使用できます。 CAとしての証明書。
  • 証明書自体は暗号ペアの公開鍵あり、鍵はそのペアの秘密鍵です。したがって、サイトは次のことを行います-秘密鍵を使用して独自のコンテンツに電子的に署名し、反対側のクライアントは公開鍵を使用してコンテンツを暗号化します。PGP を使用する場合と同じです。
  • サーバーからクライアントへのデータは、ES、3DES、Blowfish、CAST128、または Arcfour などの暗号化されたアルゴリズムのいずれかを使用して暗号化され、クライアントがホストを信頼できるものとして承認した後にクライアントによって初期化されたアルゴリズム キーであり、そのキーはサーバーの公開キーによって暗号化されます ( https の場合は証明書) その後、クライアントからサーバーへのデータもそのアルゴリズムによって暗号化され、上記のスキームを使用して鍵交換が行われます。

詳しくはグーグルで

このスキーマを使用して、サーバーがクライアントに送信するデータを偽装できますか?

于 2012-10-28T05:00:29.273 に答える
0

スプーフィングを完全に防ぐ方法はあまりありませんが、ブラウザーと同様に、証明書の信頼性を検証することはできます。SSL 証明書がどのように機能するかについての良い情報については、次のリンクを参照してください。

SSL 証明書はどのように検証されますか?

ここで、証明書を完全に検証しなくても、正しいマシンと通信していることを確認するためにできることがいくつかありますが、リモート マシンにアクセスできる必要があります。最も簡単な方法の 1 つは、salt 変数を使用した単純なハンドシェイクです。

たとえば、一意のハッシュを生成するリモート マシン上のファイルを呼び出します。たとえば、選択した単語でソルトされたタイムスタンプと、これまでにハンドシェイクを行った回数です。コンピューターはそのハッシュを期待値と照合し、別のソルトで同じことを行い、それをリモート コンピューターに送信してハンドシェイクが完了したことを示し、両方のコンピューターがカウントをインクリメントして、次回ハッシュが異なるようにします。

于 2012-10-28T05:00:02.377 に答える