2017-03-20 4 views
0

J'ai mis en place un serveur simple pour tester mon certificat TLS, la partie TLS fonctionne très bien. J'ai mon DNS via CloudFlare.CloudFlare ne me laissera pas servir seulement HTTPS, il ne fonctionne que si je sers HTTP avec HTTPS

Je voudrais que le site reste anonyme donc je viens de changer le domaine en "example.com".

Voici le code pour le simple serveur:

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)) 
} 

Maintenant, si je lance comme le serveur cela, et aller à https://example.com il ne fonctionne pas.

Mais si je change la partie qui me permet de servir HTTP à ceci:

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

Puis, soudain, HTTP et HTTPS fonctionne. Donc, si je vais sur mon site en tapant http://example.com, et https://example.com, les deux fonctionnent bien.

Si je commente sur go serveHTTP() et essayer de rediriger HTTP vers HTTPS comme ceci:

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

Puis-je obtenir ceci sur mon écran:

enter image description here

Si je revenir à ceci:

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

et accéder à la page non Le nom de domaine est approximatif, mais bien que l'adresse IP, je reçois un avertissement parce que le certificat n'est pas délivré à l'adresse IP, mais le nom de domaine que j'utilise.

enter image description here

Si je persiste en cliquant sur Avancé et en ajoutant exception alors cela fonctionne.

enter image description here

Donc en fait il est servi au port 443, mais en essayant d'accéder à la page par le nom de domaine, qui laisse passer par CloudFlare DNS, il ne fonctionne pas.

Même si je n'utilise que CloudFlare comme "DNS seulement" cela ne fonctionne toujours pas d'importance:

enter image description here

Ou si je change de proxy, toujours le même:

enter image description here

J'ai désactivé le cache et j'utilise le mode développeur pour obtenir des "réponses en temps réel" de mon serveur.

enter image description here

Donc summerize, depuis que je suis mon DNS par CloudFlare, CloudFlare ne me laisse pas servir HTTPS, sans HTTP. J'ai besoin de HTTP et HTTPS sans redirection HTTP. C'est vraiment bizarre et je ne sais pas comment résoudre ce problème.Le serveur sert à travers 443 parce que comme je l'ai montré si j'essaie d'accéder à la page via l'adresse IP et ajouter une exception de sécurité, la page est réellement servie.

Que puis-je faire?

+0

Notez que Cloudflare en mode "DNS seulement" n'interagit pas avec HTTP (S), comme Cloudflare ne serait plus mandatement votre trafic. Les navigateurs vont essayer 'http: // example.com' quand vous entrez simplement' example.com' par défaut, donc à moins que vous ne spécifiez 'https: // example.com', il échouera. Vous devriez donc écouter sur 80, rediriger vers HTTPS, et si vous voulez que le comportement par défaut après la première requête soit HTTPS (toujours), utilisez HSTS: https://developer.mozilla.org/en-US/docs/ Web/HTTP/En-têtes/Strict-Transport-Security – elithrar

+0

Merci pour cette information! – Alex

Répondre

0

Lorsque Cloudflare est défini sur le mode SSL flexible, the connection to the origin will always be over HTTP (pas HTTPS).

De Cloudflare KB:

Vous ne voyez pas besoin d'avoir un certificat SSL sur votre serveur web, mais vos visiteurs encore le site comme étant HTTPS activé. Cette option n'est pas recommandée si vous avez des informations sensibles sur votre site web . Ce paramètre ne fonctionnera que pour le port 443-> 80, pas pour les autres ports que nous supportons comme 2053. Il ne doit être utilisé que comme dernier si vous ne pouvez pas installer SSL sur votre propre serveur web, mais est moins sûr que toute autre option (même « Off »), et pourrait même vous mécontenteraient lorsque vous décidez de passer loin de: Comment puis-je résoudre la boucle infinie ... redirect

pour Pour changer cela, allez dans l'onglet Crypto du tableau de bord Cloudflare et dans l'option SSL, changez "Flexible" en "Full (Strict)" (ou "Full" si vous utilisez un CERT auto-signé).

Cloudflare SSL Modes

+0

Merci pour l'aide! – Alex