使用openssl验证验证证书链

使用openssl验证验证证书链,openssl,certificate,Openssl,Certificate,我正在使用以下组件构建自己的证书链: Root Certificate - Intermediate Certificate - User Certificate 根证书是自签名证书,中间证书由根证书和用户由中间证书签名 现在我想验证一个用户证书是否有其根证书的锚 与 验证是可以的。在下一步中,我将使用 openssl verify -verbose -CAfile Intermediate.pem UserCert.pem 验证结果表明 error 20 at 0 depth lookup

我正在使用以下组件构建自己的证书链:

Root Certificate - Intermediate Certificate - User Certificate
根证书是自签名证书,中间证书由根证书和用户由中间证书签名

现在我想验证一个用户证书是否有其根证书的锚

验证是可以的。在下一步中,我将使用

openssl verify -verbose -CAfile Intermediate.pem UserCert.pem
验证结果表明

error 20 at 0 depth lookup:unable to get local issuer certificate

有什么问题吗?

来自
验证
文档:

如果发现一个证书是它自己的颁发者,则假定它是根CA

换句话说,根CA需要自签名才能进行验证。这就是为什么你的第二个命令不起作用。请尝试以下方法:

openssl验证-CAfile RootCert.pem-untrusted Intermediate.pem UserCert.pem

它将在一个命令中验证整个链。

这是
cat的少数合法作业之一:

openssl verify -verbose -CAfile <(cat Intermediate.pem RootCert.pem) UserCert.pem

openssl-verify-verbose-CAfile问题是,
openssl-verify
不起作用


openssl-verify
在第一个自签名证书处停止,因此您不会真正验证链,因为中间证书通常是自签名的

我假设您希望在尝试将证书文件安装到生产性web服务中之前,有101%的把握证书文件是正确的。这里的配方正好执行飞行前检查

但是,请注意,
openssl-verify
的输出并不意味着以后一切都能正常工作。是的,它可能会发现一些问题,但不是全部

下面是一个脚本,它在您将证书链安装到Apache之前验证证书链。也许这可以通过一些更神秘的OpenSSL魔法来增强,但我不是OpenSSL大师,我的工作如下:

#!/bin/bash
# This Works is placed under the terms of the Copyright Less License,
# see file COPYRIGHT.CLL.  USE AT OWN RISK, ABSOLUTELY NO WARRANTY. 
#
# COPYRIGHT.CLL can be found at http://permalink.de/tino/cll
# (CLL is CC0 as long as not covered by any Copyright)

OOPS() { echo "OOPS: $*" >&2; exit 23; }

PID=
kick() { [ -n "$PID" ] && kill "$PID" && sleep .2; PID=; }
trap 'kick' 0

serve()
{
kick
PID=
openssl s_server -key "$KEY" -cert "$CRT" "$@" -www &
PID=$!
sleep .5    # give it time to startup
}

check()
{
while read -r line
do
    case "$line" in
    'Verify return code: 0 (ok)')   return 0;;
    'Verify return code: '*)    return 1;;
#   *)  echo "::: $line :::";;
    esac
done < <(echo | openssl s_client -verify 8 -CApath /etc/ssl/certs/)
OOPS "Something failed, verification output not found!"
return 2
}

ARG="${1%.}"
KEY="$ARG.key"
CRT="$ARG.crt"
BND="$ARG.bundle"

for a in "$KEY" "$CRT" "$BND"
do
    [ -s "$a" ] || OOPS "missing $a"
done

serve
check && echo "!!! =========> CA-Bundle is not needed! <========"
echo
serve -CAfile "$BND"
check
ret=$?
kick

echo
case $ret in
0)  echo "EVERYTHING OK"
    echo "SSLCertificateKeyFile $KEY"
    echo "SSLCertificateFile    $CRT"
    echo "SSLCACertificateFile  $BND"
    ;;
*)  echo "!!! =========> something is wrong, verification failed! <======== ($ret)";;
esac

exit $ret
你怎样才能知道哪些文件是需要的,哪些文件是不需要的,哪些文件的顺序是什么


好吧,进行实验,直到
检查告诉你一切正常。它就像一个电脑益智游戏来解开谜语。每一个单身。时间即使是职业选手。但是每次你需要这样做的时候,你都会变得更好。因此,你肯定不是唯一一个承受所有痛苦的人。这是SSL,你知道吗?SSL可能是我在30多年的专业系统管理中见过的最糟糕的设计之一。有没有想过为什么加密技术在过去30年里没有成为主流?这就是为什么。”nuff说。

在就同一个问题中断了整整一天的讨论之后,在事先不知道SSL证书的情况下,我下载了,并将我的密钥库导入其中,对证书链进行了清晰的可视化

截图:


您可以使用openssl轻松验证证书链。完整链将包括CA证书,因此您应该看到有关CA和证书本身的详细信息


openssl x509-in fullchain.pem-text-noout

我必须对letsencrypt证书进行验证,我是这样做的:

  • 从下载根证书和中间证书
  • 发出此命令:

    $ openssl verify -CAfile letsencrypt-root-cert/isrgrootx1.pem.txt -untrusted letsencrypt-intermediate-cert/letsencryptauthorityx3.pem.txt /etc/letsencrypt/live/sitename.tld/cert.pem 
    /etc/letsencrypt/live/sitename.tld/cert.pem: OK
    

  • 如果您只想验证
    UserCert.pem
    颁发者实际上是
    Intermediate.pem
    ,请执行以下操作(示例使用:
    OpenSSL 1.1.1
    ):

    您将获得:

    UserCert.pem: OK
    


    openssl-verify
    不像SSL客户端那样处理证书链。您可以通过三步流程复制他们所做的工作:

    (cat cert.pem chain.pem | diff -q fullchain.pem -) && \
    openssl verify chain.pem && \
    openssl verify -CAfile chain.pem cert.pem
    
    这将确认
    fullchain.pem
    =
    cert.pem
    +
    chain.pem
    ,并且根据安装在您系统上的ca(通常在
    /etc/ssl/certs
    中,从
    ca证书
    包中),它是合法的


    如果您试图验证letsencrypt/ACME,请注意letsencrypt为每个域提供四个文件:

    • cert.pem
    • chain.pem
    • fullchain.pem
    • privkey.pem
    其中,您的证书对是(
    fullchain.pem
    privkey.pem
    ),非(
    cert.pem
    privkey.pem
    )或(
    chain.pem
    privkey.pem

    例如,在nginx.conf中,您可以放置:

    ssl_certificate /etc/letsencrypt/domain.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/domain.example.com/privkey.pem;
    

    我正在投票表决这个答案,因为我最近不得不这么做,在尝试了
    man verify
    列出的不同选项之后,我发现
    -untrusted
    参数是指定中间证书时使用的正确参数。我认为第二个答案更准确-它将证书链传递给-CAfile参数。
    -untrusted
    不会检查证书链是否完全有效。请考虑将中间和root传递为<代码> CAfile < /COD>,如其他问题所建议的。使用不可信的中间程序。如果有可能发生以下情况:PEM,这不是OP所要求的,但是如果您想验证不是自签名链,那么使用St/BaseCa文件代替您自己的。例如,在使用自制openssl的OS X上使用:
    openssl verify-CAfile/usr/local/etc/openssl/cert.pem-untrusted Intermediate.pem UserCert.pem
    。我只是用一个我知道是正确的链(它为我的雇主提供生产流量)重新运行命令,然后用另一个不相关的根证书再次运行命令。请参阅。警告:如果Intermediate.pem完全不受信任,请不要使用此选项。更多信息请阅读这里:谢谢你指出这一点,格雷格。当我给出答案时,我从发行人的主页上下载了根目录和中间目录,所以我没有想到这一点。我已经更新了答案,以明确中间层对该命令的信任程度。@some昵称,请参见Tony的评论。无论如何,最好使用-untrusted选项。如果你想进一步了解,我建议你问自己的问题
    UserCert.pem: OK
    
    UserCert.pem: verification failed
    
    (cat cert.pem chain.pem | diff -q fullchain.pem -) && \
    openssl verify chain.pem && \
    openssl verify -CAfile chain.pem cert.pem
    
    ssl_certificate /etc/letsencrypt/domain.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/domain.example.com/privkey.pem;