Yesod 脚手架站点 browserId TlsException
Yesod scaffolded site browserId TlsException
我想做什么
在 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 应用程序或我的代理设置中,而不是我如何在机器 运行 网络服务器上安装证书(两者实际上都是 Docker 容器,所以我广泛使用 'machine' 这个词)。我正在寻找解决方案,如果找到,我会 post 一个。同时感激地接受了所有的帮助。我的 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;
}
}
原来这是一个 Docker 问题,而不是 Yesod 问题。 Docker 容器 运行 该应用程序没有受信任的证书,因此我只是重建它并 ADD
从主机中编辑了这些证书。问题已解决。
我想做什么
在 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 应用程序或我的代理设置中,而不是我如何在机器 运行 网络服务器上安装证书(两者实际上都是 Docker 容器,所以我广泛使用 'machine' 这个词)。我正在寻找解决方案,如果找到,我会 post 一个。同时感激地接受了所有的帮助。我的 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;
}
}
原来这是一个 Docker 问题,而不是 Yesod 问题。 Docker 容器 运行 该应用程序没有受信任的证书,因此我只是重建它并 ADD
从主机中编辑了这些证书。问题已解决。