【问题标题】:Yesod scaffolded site browserId TlsExceptionYesod 脚手架站点 browserId TlsException
【发布时间】:2015-06-17 11:05:56
【问题描述】:

我想做什么

在 Yesod 中使用 BrowserId 创建和验证用户。

我尝试过的

我没有更改脚手架站点的身份验证代码。我在Foundation.hs 中阅读的以下内容表明,当他们使用 browserId 进行身份验证时,这将创建一个新用户。

getAuthId creds = runDB $ do
    x <- getBy $ UniqueUser $ credsIdent creds
    case x of
        Just (Entity uid _) -> return $ Just uid
        Nothing -> Just <$> insert User
            { userIdent = credsIdent creds
            , userPassword = Nothing
            }

但是当我使用 BrowserId/Persona 进行身份验证时,我会得到一个带有以下错误消息的页面:

TlsException (HandshakeFailed (Error_Protocol ("certificate rejected: [SelfSigned]",True,CertificateUnknown)))

我找不到生成这个的文件。起初我认为通过 https 为网站提供服务可能会解决它,但我现在已经实现了 https,但它没有。我使用的是签名的 CA 证书。

预期行为

验证现有用户应该让他们登录。验证以前未知的用户应该添加他们。

谁能解释我错过了什么?

编辑:tls-retreivecertificate 输出

运行tls-retrievecertificate mydomain.com 443 --verify --chain 表明我的站点正在成功返回其证书和签名机构的证书,但导致UnknownCA 失败。

运行tls-retrievecertificate twitter.com 443 --verify --chain 显示证书和UnknownCA

因此,我认为这里的问题出在运行我的 Yesod 应用程序的机器上或在我的代理设置中,而不是我在运行 Web 服务器的机器上安装证书的方式(两者实际上都是 Docker 容器,所以我正在使用广义上的“机器”一词)。我正在寻找一个解决方案,如果我找到它会发布一个。与此同时,所有的帮助都得到了感激。我的 Nginx 设置如下:

# see http://serverfault.com/questions/577370/how-can-i-use-environment-variables-in-nginx-conf#comment730384_577370
upstream localhost {
    server api_1:3000;
}

server {
    listen 80;
    listen [::]:80;

    server_name example.com;

    return 301 https://$server_name$request_uri;
}
server {
    listen 443 default_server ssl;

    server_name example.com;

    ssl on;
    ssl_certificate /etc/nginx/ssl.cert;
    ssl_certificate_key /etc/nginx/ssl.dkey;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://localhost;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

【问题讨论】:

  • 请遵循 TLS 调试步骤:github.com/vincenthz/hs-tls#common-issues
  • @MichaelSnoyman 感谢您的提示 — 我已编辑问题以反映获得我的信息。这可能最终会成为“因为错过它而自责”的情况,但现在我仍然很难过。

标签: authentication ssl docker yesod


【解决方案1】:

原来这是一个 Docker 问题,而不是 Yesod 问题。运行该应用程序的 Docker 容器没有受信任的证书,所以我只是重建它并 ADDed 来自主机的证书。问题解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 2015-07-27
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多