【问题标题】:Golang + nginx + httpsGolang + nginx + https
【发布时间】:2017-04-10 13:34:06
【问题描述】:

我有 - Go 作为侦听器 httphttps 访问服务器。 Nginx 配置为处理传入的 http + https 请求。证书有序。 使用单独的服务器可以完美地运行在 https 协议上对它们的查询结果。但是,当我使用代理 nginx 时,https 没有得到服务器的响应,服务器 Go

"http:来自 127.0.0.1:54037 的 TLS 握手错误:tls:第一条记录 看起来不像 TLS 握手

可能是什么问题?

客户端去:

package main

import (
    "net/http"
    "log"

)

func HelloSSLServer(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain")
    w.Write([]byte("This is an example server.\n"))
    // fmt.Fprintf(w, "This is an example server.\n")
    // io.WriteString(w, "This is an example server.\n")
}

func main() {
    http.HandleFunc("/", HelloSSLServer)
    go http.ListenAndServe("192.168.1.2:80", nil)
    err := http.ListenAndServeTLS("localhost:9007", "/etc/letsencrypt/live/somedomain/fullchain.pem", "/etc/letsencrypt/live/somedomain/privkey.pem", nil)

    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }



}

Nginx 配置:

server {
    listen       192.168.1.2:80;
    server_name   somedomain;
    rewrite ^ https://$host$request_uri? permanent;    
}
server {
    listen        192.168.1.2:443 ssl;
    server_name   somedomain;
    access_log    /var/log/nginx/dom_access.log;
    error_log     /var/log/nginx/dom_error.log;
    ssl_certificate     /stuff/ssl/domain.cert;
    ssl_certificate_key /stuff/ssl/private.cert;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;


    location /
    {
        proxy_pass http://localhost:9007;
#       proxy_redirect    http://localhost:1500 http://site1;
        proxy_cookie_domain localhost somedomain;
        proxy_buffering off;

        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Client-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

【问题讨论】:

    标签: nginx go https


    【解决方案1】:

    https 与proxy_pass 一起使用

    location /
    {
        proxy_pass https://localhost:9007;
        ...
    }
    

    【讨论】:

      【解决方案2】:

      nginx .config 文件应该是这样的

      server {
              listen 443 ssl http2;
              listen 80;
              server_name www.mojotv.cn;
              ssl_certificate     /home/go/src/my_go_web/ssl/**.pem; 
              ssl_certificate_key /home/go/src/my_go_web/ssl/**.key; 
              ssl_session_timeout 5m;
              ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
              ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
              ssl_prefer_server_ciphers on;
              location /(css|js|fonts|img)/ {
                  access_log off;
                  expires 1d;
                  root "/home/go/src/my_go_web/static";
                  try_files $uri @backend;
              }
              location / {
                  try_files /_not_exists_ @backend;
              }
              location @backend {
                 proxy_set_header X-Forwarded-For $remote_addr;
                 proxy_set_header Host $http_host;
                 proxy_pass http://127.0.0.1:********;
              }
              access_log  /home/wwwroot/www.mojotv.cn.log;## nginx log path
      }
      

      the golang web app with http2 ssl feature shiped with nginx

      【讨论】:

        【解决方案3】:

        对于没有额外配置的更基本的 Go 服务器,我收到与 OP 类似的错误消息。

        tls:第一条记录看起来不像 TLS 握手

        我的临时修复只是确保测试 URL 在 URL 中包含“https://”和端口号。

        没用 - ipaddress

        没用 - https://ipaddress

        工作 - https://ipaddress:8081

        它将用于测试,直到进行更高级的设置。仅发布此内容以帮助其他人进行故障排除。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-22
          • 2016-06-27
          • 1970-01-01
          • 1970-01-01
          • 2020-09-11
          • 1970-01-01
          相关资源
          最近更新 更多