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:
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.
Si je persiste en cliquant sur Avancé et en ajoutant exception alors cela fonctionne.
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:
Ou si je change de proxy, toujours le même:
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.
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?
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
Merci pour cette information! – Alex