2016-04-30 9 views
2

ウェブサイトがSSLを使用しているかどうかを確認するスクリプトを作成しています。たとえば、「http://www.google.com/」を使用すると、「https://www.google.com/」にリダイレクトされます。それをどうやって確認できますか?私は次のcURLコードを使ってウェブサイトのヘッダーを取得しています。ウェブサイトがCURLを使用してSSLを使用しているか確認してください

<?php 
$url = 'https://www.google.com'; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); // set url 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); // set browser/user agent 
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header'); // get header 
curl_exec($ch); 

function read_header($ch, $string) { 
    print "Received header: $string"; 
    return strlen($string); 
} 
?> 

出力:要件を満たすためには

HTTP/1.1 302 Found 
Cache-Control: private 
Content-Type: text/html; charset=UTF-8 
Location: https://www.google.co.in/?gfe_rd=cr&ei=YEAkV7SEFrTv8wexyy0 
Content-Length: 259 
Date: Sat, 30 Apr 2016 05:19:28 GMT 
Alternate-Protocol: 443:quic 
Alt-Svc: quic=":443"; ma=2592000; v="33,32,31,30,29,28,27,26,25" 
+0

どのサイトでもhttps ....の返品を確認するだけです。 –

+0

を試しました。その何も返さない –

+0

@ダゴン私はコードを変更しました。これで、httpとhttpsの両方のWebサイトにアクセスできます。しかし、ヘッダーの違いはありません –

答えて

0

我々は最初の "はSSLを使用して、" 何を理解する必要がある "はSSLを使用して、このサイトで" 実際に意味しています。 HTTPクライアントのコンテキストで

、それは一般的にHTTP要求をサーバーが少なくとも標準のSSLポートで待機していること(ポート443)を意味します。だから良い最初のチェックは、単にそのポート上のリモートサーバーへのTCP接続を開始しようとすることができます。リモートホストが接続を受け入れる場合は、試行するかどうかを少なくとも知っていて、それがわからない場合は、標準のSSLポートでリッスンしていません。

このcURLは少し高すぎます。その代わりに、指定されたポートでfsockopen which makes it possible to simply open this internet connectionを試して、必要な情報を得るための十分な情報を得ることができます。リモートホストはこのポートでリッスンしたり、そこで接続を受け付けますか?

function connect($host, $port, $timeOut = 5) { 
    $fp = fsockopen($host, $port, $errno, $errstr, $timeOut); 
    if (!$fp) { 
     printf("It looks like the host '%s' does not accept connections on port %d - error #%d [%s]\n", $host, $port, $errno, $errstr); 
     return true; 
    } else { 
     fclose($fp); // we know it's listening 
     printf("It looks like the host '%s' does accept connections on port %d\n", $host, $port); 
     return false; 
    } 
} 

$host = "www.google.com"; 
$port = 443; 
connect($host, $port); 

これは実際には、リモートホストが通信にSSLを使用して、実際にあるかどうかを確認していませんが、それは、少なくとも、それが標準のSSLポート上のサーバーに話をしようとしている価値があるかどうかを教えてくれありません。最初にSSL経由でリクエストを送信しようとしないため、安価な方法です。そこからhttpsを介してさらにリクエストを送信し、そのレスポンスがカールで成功したことを確認したい場合は、確かにそれを行うこともできます。

あなたの質問に基づいて、サーバーがHTTP経由で場所ヘッダーを送信して、何とかこのサイトがSSLを使用していると判断したと仮定していると思います。本当じゃない。リモートホストは両方のポートでトラフィックを受け入れることができます。リモートホストは、標準のHTTPポート経由でSSLポートにリダイレクトすることもできません(、つまりhttp://からhttpsにリダイレクトしようとする)。リモートホストは、実際にはポート80でリッスンしていない可能性があります。それはHSTS or HTTP Strict Transport Securityのようなものに頼っているかもしれません。

すべての場合、リモートホストがHTTP経由でSSL転送を使用していることを確認する唯一の方法は、実際に接続を確立することです。 curlによるhttps要求が正常に応答を生成するという事実は、ピア証明書とリモートアイデンティティの検証のような適切なSSLチャネルをすべて経由していると仮定すると、ある程度までは結論づけられます。

1

PHP -

カール、私はカールを使用して過剰ですが、とにかくここに行くと思います。

<?php 
function ignoreHeader($curl, $headerStr) { 
    return strlen($headerStr); 
} 

$curl = curl_init("https://example.com/"); 
curl_setopt($curl, CURLOPT_NOBODY, TRUE); 
curl_setopt($curl, CURL_HEADERFUNCTION, 'ignoreHeader'); 
curl_exec($curl); 

$result = false; 
if (curl_errno($curl) == 0) { 
    $info = curl_getinfo($curl); 
    if ($info['http_code'] == 200) { 
    $result = true; 
    } 
} 
?> 

PHP

あなたは、ウェブサイトは、SSL証明書を持っているかどうかを確認したい場合。ストリームを開いてSSL証明書のパラメータを確認するだけです。

<?php 
// Create a stream context 
$stream = stream_context_create (array("ssl" => array("capture_peer_cert" => true))); 

// Bind the resource 'https://www.example.com' to $stream 
$read = fopen("https://www.example.com", "rb", false, $stream); 

// Get stream parameters 
$param = stream_context_get_params($read); 

// Check that SSL certificate is not null 
// $cert should be for example "resource(4) of type (OpenSSL X.509)" 
$cert = $params["options"]["ssl"]["peer_certificate"]; 
$result = (!is_null($cert)) ? true : false; 
?> 

あなたはホストが443ポートで接続を受け入れるかどうかを確認したい場合は、ホストとのソケット接続を開始するfsockopenを使用することができます。

<?php 
// Set host and port. 
$host = 'example.com'; 
$port = 443; 

// Initiate a socket connection with 'example.com' and check the result. 
$fp  = fsockopen(ssl://{$host}, $port, $errno, $errstr, 30); 
$result = (!is_null($fp)) ? true : false; 
?> 
関連する問題