AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题

问题[client-certificate](server)

Martin Hope
T2PS
Asked: 2021-10-22 00:40:02 +0800 CST

Apache 2.4:仅非 GET 方法需要客户端证书

  • 1

我们有一个在 HTTP 上运行的内部服务,它前面有一个 Apache 2.4 实例(Debian Bullseye)作为 HTTPS 的代理。Apache 和 HTTPS 已启动并正在运行,但对客户端证书还有一个额外要求——具体而言,GET 和 HEAD 请求可以匿名进行,但所有其他方法必须提供符合特定条件的有效客户端证书。

我们构建的软件以 IIS 为目标,因此 Apache 对我们来说是一个未知数(最初的实施者已经离开)。我们尝试调整我们继承的配置的配置的站点部分(省略证书文件路径指令)为:

SSLVerifyClient optional
SSLVerifyDepth 10

ProxyPass /internal http://<internalIP>:/internal
ProxyPassReverse /internal http://<internalIP>:/internal
SSLOptions +StdEnvVars

<Location /internal>
  Order deny,allow
  Allow from all

  <LimitExcept GET>
    SSLRequire ( %{SSL_CLIENT_S_DN_O} eq "(org)" and %{SSL_CLIENT_S_DN_OU} eq "(unit)" and %{SSL_CLIENT_S_CN} eq "(name)" )
  </LimitExcept>
</Location>

我们还没有尝试使用客户端证书,例如。POST 因为一个简单的 GEThttps://<proxy>/internal现在失败并显示 403 和 errors.log 消息:

AH02229:访问代理:http://{internalIP}/internal 失败,原因:未满足 SSL 要求表达式

乍一看,这似乎SSLRequire也适用于 GET,与<LimitExcept>.

我们可以使用指令组合来获得所需的行为吗?(理想情况下,它也会远离明显现在已弃用SSLRequire的东西。)

mod-ssl apache-2.4 client-certificate
  • 1 个回答
  • 278 Views
Martin Hope
jcsanyi
Asked: 2021-04-17 20:29:30 +0800 CST

后缀客户端证书信息未传递给 opendkim milter

  • 2

我有一个私有后缀服务器,它使用 dovecot sasl 来选择性地验证提交客户端,我正在尝试将它设置为也接受客户端证书,以允许它充当某些特定源服务器的中继主机。

我已经让它大部分工作了,但遇到了一个小问题,opendkim milter 无法将经过证书身份验证的中继连接识别为内部或经过身份验证,因此它没有添加 DKIM 签名。

在 main.cf 中:

milter_default_action = accept
smtpd_milters = inet:opendkim:8891
non_smtpd_milters = inet:opendkim:8891

smtpd_tls_CAfile = /path/to/private-ca-cert.pem
tls_append_default_CA = no
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,permit_tls_all_clientcerts,reject_unauth_destination
smtpd_relay_restrictions = permit_mynetworks,permit_sasl_authenticated,permit_tls_all_clientcerts,reject_unauth_destination

在提交/inet 下的 master.cf 中:

-o smtpd_client_restrictions=permit_sasl_authenticated,permit_tls_all_clientcerts,reject
-o smtpd_tls_ask_ccert=yes

以上所有方法都有效,并且允许提供由我的私有 CA 签名的有效证书的连接进行中继访问。

但是,这些中继的电子邮件不是由 opendkim 签名的——相反,opendkim milter 会记录以下内容:

external host [host.that.connected.with.cert] attempted to send as [mydomain.com]

我知道我可以使用 opendkimExternalIgnoreList配置,但是由于这些主机位于动态 IP 上,这不是一个理想的解决方案,我正在寻找一种接受任何主机的解决方案,就像它接受通过 SASL 身份验证的提交连接发送的邮件一样任何邮件客户端。

我相信我已经将它追溯到{auth_authen}milter 用来确定邮件是否来自经过身份验证的连接的宏...... postfix 只是将该宏设置为 sasl 用户名。

有什么方法可以扩展功能{auth_authen}或添加新宏(使用 opendkim 的MacroList配置)以指示使用了有效的客户端证书?

postfix client-certificate milter
  • 1 个回答
  • 205 Views
Martin Hope
Ampersand
Asked: 2021-04-17 18:51:04 +0800 CST

Nginx 上的 MTLS 与客户端 Android 应用程序一起使用?

  • -2

有没有办法以便宜的方式获得适用于无根 v10+ Android 客户端的 MTLS/双向 SSL/客户端证书?

我有几个个人 api 端点,我希望只有我和几个家庭成员可以公开访问它们,但会过滤掉所有其他流量,比如坏机器人、漏洞扫描程序或同一网关上的任何爱管闲事的客户端。我一直在使用适用于机器人的 IP 过滤,但仍会暴露给白名单 ip 上的任何设备。

目前,我通过 Nginx 上的子域对端点进行反向代理,然后使用 DDNS IP 白名单和 444 过滤其余的访问。另一个可用于限制 Nginx 访问的选项是通过客户端证书/MTLS。这似乎很合适,我可以让 Nginx 请求客户端证书作为可选,并且 444 除了匹配映射的 ssl_client_fingerprint 之外的所有流量。这将是一个比 IP 更严格的设置。

不过,我创建了自己的私有 EC 根 CA、中间服务器 CA 和客户端证书,所有证书都经过签名并链接在一起,并使用 OpenSSL 打包在 PFX 中。在 MacOS 和 Windows 上,一切都运行良好,并且在浏览器中和通过访问 API 的应用程序中都符合预期。Nginx 从客户端获取正确的证书,并允许匹配指纹哈希,否则会断开连接。

在 Android 10+ 上,通过浏览器访问时一切正常,完美。当我尝试通过 Android 应用程序访问 API 时出现问题,Nginx 没有得到客户端证书响应。

从我收集到的信息来看,这种设置曾经可以工作,也许 Android <=7 是事情发生变化的地方。我的理解是,从 8+ 开始,Android 应用程序在默认情况下根本不再信任用户信任存储/私有 CA 客户端链,只有公共系统存储,除非他们在编译 APK 之前在应用程序管理/网络安全设置中明确允许这样做?我假设更改存在有效且必要的安全原因。

有没有办法让这项工作变得便宜?这就是我认为我的选择:

  1. 购买可以签署客户端证书的公共知名 CA?不确定我是否可以摆脱便宜的 DV 或者它是否必须是更复杂和昂贵的东西?

  2. 在服务器上设置 OpenVPN 服务,并为需要访问的应用程序设置隧道。与客户端证书相比,似乎有点矫枉过正。我使用的是小型 VPS,较少的开销对我来说是更好的选择。

  3. 手动滚动上述 Android 应用程序的开源 APK,以允许用户信任存储。好像有点痛...

  4. 根所有设备以强制进行证书身份验证。对于所有需要的设备,我不是一个选择。

  5. 坚持使用 IP 白名单。不完美,但它确实可以将坏扫描仪排除在外。

有没有人有任何我可能不知道的替代建议、建议或更正我在上面尝试做的事情?

干杯

nginx reverse-proxy certificate-authority openssl client-certificate
  • 1 个回答
  • 345 Views
Martin Hope
poppopretn
Asked: 2020-12-02 18:20:08 +0800 CST

Lighttpd 客户端证书认证

  • 2

我正在尝试使用我自己的内部 Windows CA 使用 lighttpd 启用客户端证书身份验证。免责声明:我对 PKI 还是很陌生:D

我的 homelab 中有一个离线根 CA 和一个从属 CA。我已经在受信任的 CA 下将根 CA 导入 Firefox。对于客户端证书,我使用 openssl 生成了一个 CSR,我使用启用了客户端身份验证的模板与我的从属 CA 签署了该 CSR。此客户端证书也作为 pfx 文件导入 Firefox。我还配置了 lighttpd,如下所示:

ssl.pemfile = "/etc/lighttpd/certs/lighttpd.pem"
ssl.ca-file = "/etc/lighttpd/certs/ca.cer"
ssl.verifyclient.activate = "enable"
ssl.verifyclient.enforce = "enable"
ssl.verifyclient.username = "SSL_CLIENT_S_DN_CN"

我收到以下错误:

火狐错误:

Peer does not recognize and trust the CA that issued your certificate.
Error code: SSL_ERROR_UNKNOWN_CA_ALERT

Lighttpd 错误:

SSL: 1 error:14089086:SSL routines:ssl3_get_client_certificate:certificate verify failed 
SSL: 1 -1 error:140E0197:SSL routines:SSL_shutdown:shutdown while in ini

其他:

Acceptable client certificate CA names
DC = org, DC = homelab, CN = homelab-V-2019-ICA-CA
Client Certificate Types: RSA sign, DSA sign, ECDSA sign

钙化酶

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            5a:00:00:00:02:47:18:65:49:6e:51:2a:56:00:00:00:00:00:02
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=V-2019-RCA-CA
        Validity
            Not Before: Nov 24 06:00:19 2020 GMT
            Not After : Nov 24 06:10:19 2021 GMT
        Subject: DC=org, DC=homelab, CN=homelab-V-2019-ICA-CA
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)

客户证书

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            56:00:00:00:23:c0:0e:f2:75:d8:de:ef:65:00:00:00:00:00:23
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: DC = org, DC = homelab, CN = homelab-V-2019-ICA-CA
        Validity
            Not Before: Dec  1 23:54:33 2020 GMT
            Not After : Nov 24 06:10:19 2021 GMT
        Subject: C = US, ST = Rhode Island, L = Providence, O = HOMELAB, OU = HOMELAB, CN = homelab-V-2019-ICA-CA.homelab.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
...
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            1.3.6.1.4.1.311.21.10: 

不知道从这里去哪里。任何帮助或文章将不胜感激。:)

lighttpd client-certificate
  • 1 个回答
  • 562 Views
Martin Hope
ZioByte
Asked: 2020-09-24 06:11:10 +0800 CST

覆盖特定 nginx 虚拟服务器的“SSL 客户端:否”

  • 0

我有一堆客户(太多而无法轻松改造),每个客户都持有一个证书(由我无法控制的非标准 CA 签名;我刚刚生成了 CSR)。

现在我需要设置一个“安全”的 Web 服务,其中服务器以通常的 ssl (https) 方式标识,客户端应该使用其证书来标识(主题已经保存了我唯一标识客户端所需的所有信息)。

不幸的是,在签名过程中,几乎所有“目的”标志都被清除了:

openssl x509 -in 57EMM020001.cer -noout -purpose 
Certificate purposes:
SSL client : No
SSL client CA : No
SSL server : No
SSL server CA : No
Netscape SSL server : No
Netscape SSL server CA : No
S/MIME signing : Yes
S/MIME signing CA : No
S/MIME encryption : No
S/MIME encryption CA : No
CRL signing : No
CRL signing CA : No
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : No
Time Stamp signing : No
Time Stamp signing CA : No

我假设“400 SSL证书错误”的“罪魁祸首”是第一个:“SSL客户端:否”。

有没有办法告诉我的本地 nginx 服务器(我可以完全控制它)忽略这些设置?

我完全理解这通常是“不好的”,因为如果没有为特定目的生成证书......那么,它不应该用于该目的!但这是我非常具体的服务器,我觉得我有权决定我信任谁。

有什么方法可以说服 nginx 以稍微宽松的方式做事吗?

我当前(不工作)的设置非常简单:

server {
    listen 443 ssl;

    resolver 127.0.0.1 8.8.8.8;
    set $backend "http://localhost:5000";

    server_name updates.example.com;

    ssl_certificate /etc/ssl/certs/server.pem;
    ssl_certificate_key /etc/ssl/private/server.key;

    ssl_client_certificate /etc/ssl/certs/CAroot.cer;
    ssl_verify_client on;

    location / {
        proxy_connect_timeout   60;
        proxy_read_timeout      60;
        proxy_send_timeout      60;
        proxy_intercept_errors  off;
        proxy_http_version      1.1;
        proxy_set_header        Host               $http_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  $scheme;
        proxy_set_header        X-Client-Subject   $ssl_client_s_dn;
        proxy_pass $backend;
    }    
}

当然,我检查了:

openssl verify -verbose -CAfile /etc/ssl/certs/CAroot.cer 57EMM020001.cer 
57EMM020001.cer: OK

提前致谢

nginx certificate-authority client-certificate
  • 1 个回答
  • 255 Views
Martin Hope
mathias barresi
Asked: 2020-06-18 07:07:06 +0800 CST

FF 中的选择客户端证书对话框仅显示可用客户端证书的子集

  • 0

问题:

我们这里有一个使用客户端证书身份验证的应用程序。多年来,这一直没有任何问题,但现在有几个客户端在 FF 和 Chrome 中遇到以下问题,但在 IE 中(还没有):“选择客户端证书”对话框不再出现,因此它们被重定向到用户名/密码登录页面。所以我假设,浏览器不会将安装的客户端证书识别为适合服务器发送的 CA 名称。

我检查了什么:

  1. 没有证书(服务器或客户端)已过期。
  2. nginx 正在向客户端发送正确的 CA 名称。我检查了使用 openssl s_client ....
  3. 我已阅读 FF 更改日志以找到任何听起来与客户端证书相关的内容,但到目前为止还没有任何内容可以解释此问题

我试过的:

  1. 我从 nginx 配置中删除了“ssl_client_certificate”和“ssl_verify_depth”,浏览器中的选择客户端对话框再次出现,只是这次显示了所有已安装的证书,包括我们应用程序的证书。选择正确的证书后,登录成功,应用程序正常运行。
    这使我得出结论,发送给客户端的 CA 名称可能是错误的,而证书本身是可以的。
  2. 正如我之前提到的,并非所有客户端都遇到此问题,因此我在测试机器上安装了来自工作客户端的客户端证书和来自非工作客户端的客户端证书。我应该注意,这两个证书都是由同一个 CA 颁发的(工作证书只是几个月前)。猜猜看:当我尝试访问应用程序时,会出现“选择证书”对话框,但它只显示一个证书(来自工作客户端的证书)。如果我再次从 nginx 配置中删除“ssl_client_certificate”指令,我可以选择(并成功登录)这两个证书中的任何一个。这与 (1.) 相比,其中一个证书似乎存在问题

现在我能做的就是引用萨姆纳-米勒先生的话:“为什么会这样?”

我希望,以前有人遇到过类似的问题,因为我唯一的其他选择是深入研究 FF 的源代码,看看如何构建合适的客户端证书列表。该客户端证书对话框的行为最近必须更改,所以我接下来要做的是在我的测试机器上降级 FF,直到它再次工作。

环境:

服务器:centOS 7,nginx 1.19.0,openssl 1.1.1f

客户端:Ubuntu 19.10 上的 Firefox 77、Chrome 83 和多个版本的 Windows

nginx配置:

ssl_verify_client optional_no_ca;
ssl_client_certificate /etc/ssl/certs/waf_client_ca.pem;
ssl_verify_depth 2;

笔记:

  • 之所以存在“optional_no_ca”,是因为出于“历史原因”,客户端证书的验证是在 nginx 之外处理的。如果我将其设置为“是”或“可选”,浏览器行为不会改变。
  • 如果我必须更换所有这些证书,那将是非常糟糕的,所以是的:我已经考虑过建立一个全新的 CA 并为所有客户颁发新证书,但是有成千上万的证书,所以我真的尽量避免这种情况。至少在我确切地知道至少一些现有的有什么问题之前。
nginx client-certificate
  • 1 个回答
  • 81 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve