【问题标题】:Trouble getting a self-signed cert working in Postman无法在 Postman 中获得自签名证书
【发布时间】:2018-01-23 10:47:10
【问题描述】:

我终于开始在我的个人网站上使用 SSL,所以我开始尝试为我的本地开发制作一个多域自签名证书(以处理 api.mydomain.local、www.mydomain.local 和mydomain.local)。我不知道这是不是我的第一个错误,但是...

由于找不到单一的包含指南,我开始使用两个教程(来自 EasyEngineDeveloperSide)来创建我的证书并将其安装在我的主机 (Win10) 上。然后,我使用DigitalOcean 指南来了解如何在我的开发服务器(Ubuntu VM)上设置我的 Apache;到此为止,没有什么大问题,除了同时使用多个向导引起的一些小问题。

我继续尝试在 Chrome 中访问我的 api,它如预期的那样给了我一个不受信任的证书值,我通过并且它工作。据我所知,这意味着证书有效吗?但是,当我尝试在 Postman 中访问我的 api 时,我收到一个错误,表明它不能接受不受信任的证书,这很好,因为它有一个关于 how to fix that 的教程。但是,它仍然不起作用。我不知道还能做些什么来解决这个问题,我在正确的轨道上吗?我的证书完全失效了吗?我在尝试进行多域证书时是否犯了核心错误?

我确实注意到的一件事是,在 Dev Tools 安全选项卡中,它显示

Subject Alternative Name missing

所以我不确定这是否意味着我的 alt 名称不起作用,但如果不是,当我在 Chrome 中点击它时它不会尝试加载证书,对吧?

【问题讨论】:

    标签: apache ssl nginx postman


    【解决方案1】:

    我在为我的网站撰写有关 SSL 证书的文章时遇到了类似的问题。所以我写了同样的shell脚本

    #!/bin/bash
    
    CERT_COMPANY_NAME=${CERT_COMPANY_NAME:=Tarun Lalwani}
    CERT_COUNTRY=${CERT_COUNTRY:=IN}
    CERT_STATE=${CERT_STATE:=DELHI}
    CERT_CITY=${CERT_CITY:=DELHI}
    
    CERT_DIR=${CERT_DIR:=certs}
    
    ROOT_CERT=${ROOT_CERT:=rootCA.pem}
    ROOT_CERT_KEY=${ROOT_CERT_KEY:=rootCA.key.pem}
    
    
    # make directories to work from
    mkdir -p $CERT_DIR
    
    create_root_cert(){
      # Create your very own Root Certificate Authority
      openssl genrsa \
        -out $CERT_DIR/$ROOT_CERT_KEY \
        2048
    
      # Self-sign your Root Certificate Authority
      # Since this is private, the details can be as bogus as you like
      openssl req \
        -x509 \
        -new \
        -nodes \
        -key ${CERT_DIR}/$ROOT_CERT_KEY \
        -days 1024 \
        -out ${CERT_DIR}/$ROOT_CERT \
        -subj "/C=$CERT_COUNTRY/ST=$CERT_STATE/L=$CERT_CITY/O=$CERT_COMPANY_NAME Signing Authority/CN=$CERT_COMPANY_NAME Signing Authority"
    }
    
    
    create_domain_cert()
    {
      local FQDN=$1
      local FILENAME=${FQDN/\*/wild}
    
      # Create a Device Certificate for each domain,
      # such as example.com, *.example.com, awesome.example.com
      # NOTE: You MUST match CN to the domain name or ip address you want to use
      openssl genrsa \
        -out $CERT_DIR/${FILENAME}.key \
        2048
    
      # Create a request from your Device, which your Root CA will sign
      if [[ ! -z "${SAN}" ]]; then
        openssl req -new \
          -key ${CERT_DIR}/${FILENAME}.key \
          -out ${CERT_DIR}/${FILENAME}.csr \
          -subj "/C=${CERT_COUNTRY}/ST=${CERT_STATE}/L=${CERT_CITY}/O=$CERT_COMPANY_NAME/CN=${FQDN}" \
          -reqexts san_env -config <(cat /etc/ssl/openssl.cnf <(cat ./openssl-san.cnf))
      else
        openssl req -new \
          -key ${CERT_DIR}/${FILENAME}.key \
          -out ${CERT_DIR}/${FILENAME}.csr \
          -subj "/C=${CERT_COUNTRY}/ST=${CERT_STATE}/L=${CERT_CITY}/O=$CERT_COMPANY_NAME/CN=${FQDN}"
      fi
    
    
      # Sign the request from Device with your Root CA
      if [[ ! -z "${SAN}" ]]; then
        openssl x509 \
          -sha256 \
          -req -in $CERT_DIR/${FILENAME}.csr \
          -CA $CERT_DIR/$ROOT_CERT \
          -CAkey $CERT_DIR/$ROOT_CERT_KEY \
          -CAcreateserial \
          -out $CERT_DIR/${FILENAME}.crt \
          -days 500 \
          -extensions san_env \
          -extfile openssl-san.cnf
      else
        openssl x509 \
          -sha256 \
          -req -in $CERT_DIR/${FILENAME}.csr \
          -CA $CERT_DIR/$ROOT_CERT \
          -CAkey $CERT_DIR/$ROOT_CERT_KEY \
          -CAcreateserial \
          -out $CERT_DIR/${FILENAME}.crt \
          -days 500 
      fi
    }
    
     METHOD=$1
     ARGS=${*:2}
    
    echo "Called with $METHOD and $ARGS"
    if [ -z "${METHOD}" ]; then
      echo "Usage ./sslcerts.sh [create_root_cert|create_domain_cert] <args>"
      echo "Below are the environment variabls you can use:"
      echo "CERT_COMPANY_NAME=Company Name"
      echo "CERT_COUNTRY=Country"
      echo "CERT_STATE=State"
      echo "CERT_CITY=City"
      echo "CERT_DIR=Directory where certificate needs to be genereated" 
      echo "ROOT_CERT=Name of the root cert"
      echo "ROOT_CERT_KEY=Name of root certificate key"
    else
      ${METHOD} ${ARGS}
    fi
    

    您可以更改 TOP 上的环境变量并使用以下方法生成自签名证书

    $ SAN=DNS.1:*.tarunlalwani.com,DNS.2:tarunlalwani.com ./sslcerts.sh create_domain_cert '*.tarunlalwani.com'
    

    编辑 1

    以前的浏览器使用 FQDN,但现在其中一些已经开始使用 SAN,即“主题备用名称”。通常 openssl 不会出现配置的 v3 扩展。 SAN 是 v3 扩展的一部分。因此,当您生成自签名证书时,它具有正确的 FQDN(完全限定域名),但没有 SAN。 Chrome 将显示这些证书的错误,但您会看到 firefox 工作正常。

    PS:摘自文章http://tarunlalwani.com/post/self-signed-certificates-trusting-them/

    【讨论】:

    • 感谢精彩的脚本!我一定会在可能的时候试一试。如果我还不接受您的回答,希望您不要介意;我希望尽可能多地了解我出错的地方,以找到解决方案。另外,我并不完全理解脚本,所以我也需要学习:)
    • 当然。阅读我的编辑以获得解释。并阅读我文章中的参考链接以获得更好的理解。并且不用担心接受答案,如果您愿意,可以等待其他人参与并接受您认为最合适的答案。
    • 感谢您的更新。我使用的两篇文章实际上是关于设置 SAN,我认为我设置正确,但我猜我没有,因为我得到了错误;但这导致了一个问题,为什么它会接受域的证书(我给它的 FQDN 为 mydomain.local,url 为 api.mydomain.local,它位于 SAN 中。
    • @RhoVisions,不知道 :-)
    猜你喜欢
    • 2020-09-27
    • 2018-01-12
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多