- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有自己的 HTTPS 服务,我正在与另一个 Ruby 应用程序通信。我想在我的应用程序 repo 中的已知时间点保存它的公钥证书,并将服务发送给我的公钥与存储的副本进行比较。要在外部服务器上安装证书,我可能必须将其转换为某种格式,因此服务器发送的文件不会相同。
我想对那个特定的公钥进行某种形式的证书固定。我需要使用 OpenSSL 比较证书的哪些字段,以验证我从服务收到的 PK 是否与从服务器收到的相同?
我想 CN 和签名至少必须匹配。还需要检查什么才能知道我拥有的公共(public)证书与我收到的公共(public)证书完全匹配(即相同的证书)?也许 OSSL 有一个内置的工具来做这件事?
最佳答案
好的,在研究了 OpenSSL 之后,我得出了以下公钥固定的简单实现。其实很简单。不幸的是,我没有看到流行的 HTTP 中间件库(如 Faraday 和 HTTPClient)提供对 verify_callback
的访问权限,它实际上在每个 OpenSSL session 中都可用。
在此示例中,如果 PK 与您之前固定的不匹配, session 将立即终止。请注意,不会使用 OpenSSL::SSL::VERIFY_NONE
调用该 block (无论如何都不应该永远不会使用)。
require 'net/http'
require 'openssl'
# Grab the cert received out of band by pigeon post
cert_code = File.read 'github.com.cer'
downloaded_cert = OpenSSL::X509::Certificate.new(cert_code)
# Tells us whether the private keys on the passed certificates match
# and use the same algo
def same_public_key?(ref_cert, actual_cert)
pkr, pka = ref_cert.public_key, actual_cert.public_key
# First check if the public keys use the same crypto...
return false unless pkr.class == pka.class
# ...and then - that they have the same contents
return false unless pkr.to_pem == pka.to_pem
true
end
# Configure a new HTTP object
http = Net::HTTP.new('github.com', 443)
http.use_ssl = true
# We will verify against our CAs in the root store, and with VERIFY_NONE
# the verify_callback will not fire at all, which defeats the purpose.
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
# verify_callback will be called once for every certificate in the chain,
# starting with the top level certificate and ending with the actual certificate
# presented by the server we are contacting. Returning false from that callback
# will terminate the TLS session. Exceptions within the block will be suppressed.
#
# Citing the Ruby OpenSSL docs:
#
# A callback for additional certificate verification. The callback is invoked
# for each certificate in the chain.
#
# The callback is invoked with two values. preverify_ok indicates if the verification
# was passed (true) or not (false). store_context is an OpenSSL::X509::StoreContext
# containing the context used for certificate verification.
#
# If the callback returns false verification is stopped.
http.verify_callback = lambda do | preverify_ok, cert_store |
return false unless preverify_ok
# We only want to verify once, and fail the first time the callback
# is invoked (as opposed to checking only the last time it's called).
# Therefore we get at the whole authorization chain.
# The end certificate is at the beginning of the chain (the certificate
# for the host we are talking to)
end_cert = cert_store.chain[0]
# Only perform the checks if the current cert is the end certificate
# in the chain. We can compare using the DER representation
# (OpenSSL::X509::Certificate objects are not comparable, and for
# a good reason). If we don't we are going to perform the verification
# many times - once per certificate in the chain of trust, which is wasteful
return true unless end_cert.to_der == cert_store.current_cert.to_der
# And verify the public key.
same_public_key?(end_cert, downloaded_cert)
end
# This request will fail if the cert doesn't match
res = http.get '/'
如果你想做整个证书固定并且证书不受轮换,你可以使用证书指纹:
def same_cert_fingerprint?(ref, actual)
OpenSSL::Digest::SHA256.hexdigest(ref.to_der) == OpenSSL::Digest::SHA256.hexdigest(actual.to_der)
end
编辑:看起来至少 excon 最近实现了这个:
https://github.com/geemus/excon/commit/12437b79bad2a0e51bb4ac5b79c155eb88128245
关于ruby - 使用 Ruby 实现 HTTPS 证书/公钥固定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22093042/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 6 年前。 Improv
我们最近构建了一个 Web 生成器应用程序(所见即所得、预先设计的模板、购物车等)。我们一直在寻找 SSL 证书的几个不同选项,甚至是通配符,以寻求解决方案。问题是我们不想每次有客户想要将 SSL 添
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 6 年前。 Improve
我想这是不可能的,但如果是这样,我想知道为什么。 假设我从附近的官方证书颁发机构之一获得了 example.com 的 SSL 证书。假设我正在运行 a.example.com 和 b.c.d.exa
在我的 java 应用程序中,我有一个带有自签名证书/ key 的 JKS keystore 。我需要加载它们并将它们转换为 BouncyCaSTLe 类型。 我正在使用 java.security.
我不是这方面的专家,但我只是遵循 Android 开发者网站上列出的代码 keytool -genkey -v -keystore orbii.jks-keyalg RSA -keysize 2048
我正在为我的一个应用程序实现推送通知系统,所以我正在关注 this教程并为此生成 SSL 证书。 我的这个应用程序还涉及应用程序和服务器之间的一些数据交换,我希望它受到 SSL 保护,我想知道从 ve
可能这是重复的问题,但我没有从上一个问题中完全清楚,这就是我发布新问题的原因。请看看这个。我会将 Ca 证书放在我的资源文件夹中以验证 ca 认证的证书,服务器中也会有相同的 ca 证书。 我正在创建
首先,我想指出这在 Internet Exporer 11 上运行良好。但出于某种原因,我无法让 FireFox 正常运行! 所以我已经添加了我自己的 rootCA 安全证书,在 Internet E
我有域“www.example.com”的 SSL 证书,我已将此证书安装在运行良好的端口 80 上的 tomcat 服务器中。现在我的要求是在 https 中运行 php 代码,因为我的 Apach
我正在构建一个 oauth 1.0a 服务,它将被 Jira 中的一个小工具使用,它是一个用 C# 编写的 .Net 3.5 应用程序。 Jira 使用 RSA-SHA1 签名方法向此服务发出请求,这
假设用户打开 https://ssl-site.example/link/index.php我用 ProxyPass 配置了我的服务器和 ProxyPassReverse在 Apache 配置中(在
我有一个 tcp 服务器,它使用证书进行 ssl/tls 和许可。对于 ssl/tls,证书存储在 pkcs#12 文件中,我认为该文件将作为安装过程的一部分进行安装。 关于 Rhino 许可,作为安
我开始想第一次在 jmeter 中记录。 我的步骤是: 我在 mac 上安装了 jmeter:brew install jmeter 我创建了新的录音模板 我点击开始按钮。它显示如下图所示的弹出窗口。
通常,我的困惑似乎正在从我在WCF上下文中理解安全性的尝试中消除。在WCF中,似乎可以将证书用于身份验证和加密。基本上,我试图理解: 如何将X509证书用作身份验证令牌? ssl证书通常不公开吗?这是
我正在尝试使用 openssl 库让客户端通过 https 连接到某些服务器。 调用堆栈是这样的: SSL_library_init(); SSL_load_error_strings(); SSL_
我正在阅读 this article其中解释了 iOS/OSX 中的代码签名。 我知道从KeyChain Access utility 我可以看到我的证书,如果展开我的开发者证书,我可以看到有一个私钥
我有一个既在互联网上又在私有(private)网络上的服务器。 我正尝试按照我的经理的要求在内部专用网络上设置 TLS。 该服务可供 Internet 和私有(private)内部网络客户端使用。 外
我在具有不同域扩展名的单个网络服务器中设置了我的站点,例如 https://mybusiness.com https://mybusiness.com.au https://mybusiness.co
我正在开发一个移动应用程序。我是网络开发的新手。 我在 GoDaddy 上有 DNS(比如 app.test.com)并且有一个只有 IP 地址的服务器(比如 31.254.42.73)。我的请求从
我是一名优秀的程序员,十分优秀!