2017-03-20 7 views
0

TLS証明書をテストするための単純なサーバーをセットアップしました。私はCloudFlareを通じて自分のDNSを持っています。CloudFlareはHTTPSだけを提供することはできません。HTTPSと一緒にHTTPを提供する場合にのみ動作します。

ウェブサイトを匿名のままにしたいので、ドメインを "example.com"に変更しました。私はそれが動作しません。このようなサーバを実行し、https://example.comに行けば今

package main 

import (
    "log" 
    "net/http" 
) 

var hostname = "example.com" 

var key = "/srv/ssl/" + hostname + "-2017.03.20.key" 
var cert = "/srv/ssl/ssl-bundle.crt" 

func main() { 
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 
     w.Write([]byte("TLS test")) 
    }) 
    // go serveHTTP() 
    // go redirectHTTP() 
    serveHTTPS() 
} 

func serveHTTP() { 
    if err := http.ListenAndServe(":80", nil); err != nil { 
     log.Fatalf("ListenAndServe error: %v", err) 
    } 
} 

func redirectHTTP() { 
    err := http.ListenAndServe(":80", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     http.Redirect(w, r, "https://"+hostname+r.RequestURI, http.StatusMovedPermanently) 
    })) 
    if err != nil { 
     log.Fatalf("ListenAndServe error: %v", err) 
    } 
} 

func serveHTTPS() { 
    log.Fatal(http.ListenAndServeTLS(":443", cert, key, nil)) 
} 

:ここ

は、単純なサーバーのコードです。

しかし、私は、私はこれにHTTPサービスを提供することができます一部変更する場合:突然その後、HTTPとHTTPSが機能の両方を

go serveHTTP() 
// go redirectHTTP() 
serveHTTPS() 

を。だから私がhttp://example.comhttps://example.comと入力して私のサイトに行くと、どちらもうまくいきます。

私はgo serveHTTP()をコメントアウトし、このようなHTTPSにHTTPをリダイレクトしようとした場合:

// go serveHTTP() 
go redirectHTTP() 
serveHTTPS() 

それから私は私の画面上でこれを取得する:

enter image description here

私はこれに戻って変更した場合:

// go serveHTTP() 
// go redirectHTTP() 
serveHTTPS() 

ページにアクセスしていないドメイン名は大まかではあるが、IPアドレスにもかかわらず、証明書がIPアドレスに発行されず、私が使用するドメイン名になっているので警告が表示されます。

enter image description here

私は、高度なクリックして、例外を追加することで解決しない場合、それは動作します。

enter image description here

だから、実際にはそれは動作しません、CloudFlareのDNSを通過することができますつまり、ポート443で提供していますが、ドメイン名によってページにアクセスしようとしています。

enter image description here

するか、私はまだ同じ、プロキシに変更した場合::私は唯一のようにCloudFlareを使用する場合でも

"DNSのみ" それはまだ問題ではありません

enter image description here

キャッシュを無効にして、開発者モードを使用して、サーバーから「リアルタイム応答」を取得する必要があります。

enter image description here

だから私はCloudFlareの経由私のDNSを持っているので、CloudFlareは私がHTTPせずに、HTTPSを果たすことはできません、summerizeします。 HTTPリダイレクトなしでHTTPとHTTPSの両方が必要です。これは本当に奇妙で、私はこれをどのように修正するか分かりません。サーバーは、IPアドレスを介してページにアクセスしようとした場合に表示され、セキュリティ例外を追加するため、実際にページが提供されているため、443を使用します。

どうすればよいですか?

+0

CloudFlareはもはやあなたのトラフィックをプロキシないであろうと「DNSのみ」モードでCloudFlareは、HTTP(S)と相互作用しないことに注意してください。ブラウザはデフォルトで 'example.com'だけを入力すると' http:// example.com'を試しますので、 'https:// example.com'を指定しないと失敗します。したがって、80でリッスンしてHTTPSにリダイレクトする必要があります.HTTPS(常に)を要求した後のデフォルトの動作を希望する場合は、https://developer.mozilla.org/en-US/docs/を使用してください。 Web/HTTP/Headers/Strict-Transport-Security – elithrar

+0

ありがとうございました! – Alex

答えて

0

のCloudFlareは柔軟なSSLモードに設定されている場合、the connection to the origin will always be over HTTP(ないHTTPS)。

CloudFlareのKBから:

あなたはあなたの訪問者がまだHTTPSが有効にされているものとしてサイトを参照してください Webサーバー上でSSL証明書を持っている必要がありますが、ありません。 ウェブサイトに機密情報がある場合は、このオプションを に設定することはお勧めしません。この設定はありません、我々は2053あなたがあなた自身のウェブサーバーでセットアップSSLにできない場合にのみ、最後の のリゾートとして使用する必要がありますようにサポートして 他のポートのために、> 80 443-ポートのために働くが、それ ますあなたは離れてそれから切り替えることを決定したときのトラブル原因他のオプション(でも「オフ」)よりも安全で、かつ可能性さえ :どのように私は無限のリダイレクトループ を修正すればよい...

ためにこれを変更するには、Cloudflareダッシュボードの[暗号]タブに移動し、SSLオプションで[フレキシブル]を[完全(厳密)]に変更します(自己署名証明書を使用している場合は[完全])。

Cloudflare SSL Modes

+0

ありがとうございました! – Alex

関連する問題