【问题标题】:HTTP Public Key Pinning (HPKP) without Openssl没有 Openssl 的 HTTP 公钥固定 (HPKP)
【发布时间】:2019-10-02 16:14:00
【问题描述】:

我打算生成以下 pin-sha256 :

Public-Key-Pins: 
  pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="; 
  pin-sha256="M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE="; 
  max-age=5184000; includeSubDomains; 
  report-uri="https://www.example.org/hpkp-report"

所以出于安全原因,我可以保留在 IIS 中,如下所示:

<system.webServer>
  ...

  <httpProtocol>
    <customHeaders>
      <add name="Public-Key-Pins" value="pin-sha256=&quot;base64+primary==&quot;; pin-sha256=&quot;base64+backup==&quot;; max-age=5184000; includeSubDomains" />
    </customHeaders>
  </httpProtocol>

  ...
</system.webServ

但是我的服务器缺少开放的 ssl 并且由于进程问题需要很长时间才能安装。

能否请您告诉我,如果没有这些 openssl,我可以生成 pin 吗?

See this link for more details

这些是 pin 生成命令,我需要在没有 openssl 的情况下执行此操作,可以吗?

openssl rsa -in my-rsa-key-file.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64

【问题讨论】:

    标签: ssl openssl base64 ssl-certificate sha


    【解决方案1】:

    这里是一个将上面的 openssl 命令链转换为将 base64 结果输出到屏幕的 openssl API 调用的示例。

    主要调用是

    根据您的情况,有很多方法可以使用上述 OPENSSL API 的变体来完成相同的工作。

    以下是 OpenSSL C API 的 C++ 用法。如果需要,您可以轻松剥离 C++ 位。

    template<typename T, typename D>
    std::unique_ptr<T, D> make_handle(T* handle, D deleter)
    {
        return std::unique_ptr<T, D>{handle, deleter};
    }
    
    bool load_rsa_private_key_and_base64_sha256_hash_public_key()
    {
        // load rsa private key in PEM format
        auto bio = make_handle(BIO_new_file("privatekey.pem", "rb"), BIO_free);
        if(!bio) return false;
        auto const key = make_handle(PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, (void*)("password")), EVP_PKEY_free);
        bio.reset();
    
        if(!key) return false;
    
        // extract private key from loaded certificate
        auto const rsa = EVP_PKEY_get0_RSA(key.get());
        if (!rsa) return false;
    
        // setup sha256 bio chain
        auto const bmd = make_handle(BIO_new(BIO_f_md()), BIO_free);
        if(!bmd) return false;
        if (!BIO_set_md(bmd.get(), EVP_sha256())) return false;
    
        auto const null_bio = make_handle(BIO_new(BIO_s_null()), BIO_free);
        auto in = BIO_push(bmd.get(), null_bio.get());
    
        // write RSA Public Key into DER format to the SHA256 digest BIO chain
        i2d_RSA_PUBKEY_bio(in, rsa);
    
        // extract the SHA256 digest
        auto mdtmp = BIO_find_type(in, BIO_TYPE_MD);
        if (!mdtmp) return false;
        std::array<char, EVP_MAX_MD_SIZE> buffer;
        auto const length = BIO_gets(mdtmp, buffer.data(), buffer.size());
    
        if(length <= 0)  return false;
    
        // convert the digest to base64 and output to the stdio
        auto const b64 = make_handle(BIO_new(BIO_f_base64()), BIO_free);
        auto const bio_out = BIO_new_fp(stdout, BIO_NOCLOSE);
        auto out = BIO_push(b64.get(), bio_out);
    
        BIO_write(out, buffer.data(), length);
        BIO_flush(out);
    
        return true;
    }
    

    【讨论】:

    • 有什么方法可以使用 cmd 生成 pin 吗?而不是代码和openssl
    • 我听起来你在问问题是错误的地方。这是一个编程答案网站...我敢肯定还有其他程序可以做你想做的事,但我不确定你会在这里得到答案。了解您需要在哪个平台上生成它也会有所帮助?至少 openssl 被移植到几乎所有平台,大多数其他程序将特定于某些平台。
    猜你喜欢
    • 2015-05-08
    • 2019-12-05
    • 2021-09-17
    • 2011-07-19
    • 1970-01-01
    • 2017-12-17
    • 2019-10-03
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多