Yesod搭建站点browserId TlsException

时间:2015-04-11 21:31:32

标签: authentication ssl docker yesod

我想做什么

在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容器所以我和# 39; m使用&#39;机器&#39;广泛地说。我正在寻找一个解决方案,如果找到它就会发一个。与此同时,所有的帮助都感激不尽。我的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;
    }
}

1 个答案:

答案 0 :(得分:0)

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