我有一个我必须使用的API.API由HTTPS保护,并使用相互身份验证/客户端证书.我有一个PEM文件和一个CRT文件.
当我经常连接到服务器时,使用PyOpenSSL我没有问题,这里是代码:
import settings
from OpenSSL import SSL
import socket
def verify(conn, cert, errnum, depth, ok):
# This obviously has to be updated
print 'Got certificate: %s' % cert.get_subject()
return ok
def password_callback(maxlen, verify, extra):
print (maxlen, verify, extra)
return settings.DEPOSIT_CODE
context = SSL.Context(SSL.SSLv23_METHOD)
context.set_verify(SSL.VERIFY_NONE, verify)
context.set_passwd_cb(password_callback)
context.use_certificate_file(settings.CLIENT_CERT_FILE)
context.use_privatekey_file(settings.PEM_FILE)
sock = SSL.Connection(context, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.connect(("someserver.com",443))
http_get_request = """
GET / HTTP/1.1
"""
sock.write(http_get_request)
print sock.recv(1000)
Run Code Online (Sandbox Code Playgroud)
但是,因为这是一个带有客户端证书的HTTPS API,我已经为它实现了一个开启工具,以某种方式修改的代码在这里:
import settings
import socket
import urllib2
def verify(conn, cert, errnum, depth, ok):
# …Run Code Online (Sandbox Code Playgroud) 我已经在 Azure 网站上部署了我的 webapi 并通过 Azure Api 管理门户公开它。我想阻止对 azurewebsites url 的访问,以便用户只能通过安全密钥通过 azure aoi 管理代理访问我的 api。你能否解释一下如何做到这一点。我听说可以使用相互证书,但在网上找不到任何描述创建此类证书和配置 web api 以有效使用它们的过程的文章。我的第二个问题是,是否有一种机制可以根据用户名/密码和产品名称获取 Api 主键。关于保留该 api 访问密钥的最佳方法是什么。客户端应用程序是否应该将其存储在某个配置文件中,并且应该在运行时以编程方式获取?
非常感谢
azure asp.net-web-api mutual-authentication azure-api-management
我在tomcat中安装了一个应用程序,目前我在http上运行.我也使用AWS API网关来公开我的应用程序.我想在aws api网关和我们创建的api之间实现相互认证.有没有我可以参考的文件.也可以使用AWS API网关和我的api实现相互身份验证.
api amazon-web-services tomcat7 mutual-authentication aws-api-gateway
我正在为小型PoC构建AWS Lambda服务。PoC中的流程为:
看起来像一个简单的lambda教程示例,但是对我来说棘手的部分是授权。我必须发布的URL仅允许通过SSL证书相互认证的请求。如何在Lambda中实现这一目标?
我找不到足够的答案来完成这项工作。我看过使用AWS API网关2路ssl cert选项。但是,要使其正常工作,我需要将接收部件证书安装到证书存储中。可能吗?还是唯一的方法是使用微型EC2盒?
在Lambda,我可以使用Node.JS,Java或Python。
我正在尝试在iOS应用中实现SSL相互身份验证.在我看到的大多数示例中,客户端证书与应用程序包捆绑在一起.但在我的情况下,我需要远程加载客户端证书(即,从链接或通过电子邮件).
如果我尝试从外部源(即邮件应用程序)加载证书,它会导航到设置应用程序并将其安装到苹果的钥匙串.因此,我的应用无法访问此证书.
所以有人请为此提出建议吗?
我有一个小型控制台应用程序,它使用客户端证书来创建HttpWebRequest:
X509Certificate Cert = X509Certificate.CreateFromCertFile("JohnDoe.cer");
HttpWebRequest Request = (HttpWebRequest)
WebRequest.Create("https://10.135.12.166:4434");
Request.ClientCertificates.Add(Cert);
Request.UserAgent = "Client Cert Sample";
Request.Method = "GET";
HttpWebResponse Response = (HttpWebResponse) Request.GetResponse();
Run Code Online (Sandbox Code Playgroud)
当我在我的机器上执行此代码时,我将访问相应的.pfx文件,我相信使用此线程中提到的内容我将能够在我的机器上安装pfx文件,但我不想这样做这个.
有什么方法可以通过某种方式在请求中附加pfx证书来提出此请求吗?我的意思是,只需在上面的代码中用JohnDoe.pfx替换JohnDoe.cer,或者类似的东西?
谢谢.
编辑:这个问题的重点是我想要一种方法来使用证书而无需将其安装在我的计算机上.我可以用esskar和xaver建议的方式使用它,但我不想在我的机器上安装cert.如果无法做到这一点,有人可以提供解释为什么我们不能这样做的任何机会?
通常,2 路 ssl 又名相互身份验证包括生成服务器 ca 密钥和证书等。然后客户端生成一个 CSR,将其提供给您,您签署他们的 CSR 并向他们提供客户端证书。
然而,
我遇到过一种情况,客户要求我通过交换彼此的 x509 公共证书来实现“相互身份验证”。这个听说过吗?也许称为“2 路 SSL”或“相互身份验证”以外的名称。
我正在努力寻找与 openssl 有关的任何文档或信息。
我正在尝试使用双向 TLS 身份验证在 GKE (v1.11.2-gke.18) 上实现 gRPC 服务。
当不强制执行客户端身份验证时,GKE 自动创建的 HTTP2 运行状况检查会响应,并且一切都连接问题。
当我打开相互身份验证时,运行状况检查失败 - 大概是因为它无法完成连接,因为它缺少客户端证书和密钥。
与往常一样,文档很简单而且相互矛盾。我需要一个完全编程的解决方案(即没有控制台调整),但除了手动将运行状况检查更改为 TCP 之外,我一直无法找到解决方案。
从我所见,我猜我要么需要:
service.alpha.kubernetes.io/app-protocols: '{"grpc":"HTTP2"}'专有注释的容器上进行 SSL 终止或者也许还有其他我没有考虑过的东西?下面的配置非常适用于带有 TLS 的 REST 和 gRPC,但会与 mTLS 中断。
服务.yaml
apiVersion: v1
kind: Service
metadata:
name: grpc-srv
labels:
type: grpc-srv
annotations:
service.alpha.kubernetes.io/app-protocols: '{"grpc":"HTTP2"}'
spec:
type: NodePort
ports:
- name: grpc
port: 9999
protocol: TCP
targetPort: 9999
- name: http
port: 8080
protocol: …Run Code Online (Sandbox Code Playgroud) mutual-authentication google-kubernetes-engine grpc kubernetes-health-check kubernetes-ingress
我的 api 位于网关后面,网关终止来自客户端的 ssl 握手,并与我的 api 启动单独的握手。任何客户端都不应该直接调用我的 api。我的要求是我必须从传入的 https 请求中提取公用名并根据列表对其进行验证。
我是 Go 新手,并使用此示例https://venilnoronha.io/a-step-by-step-guide-to-mtls-in-go作为使用 https 构建 Go 服务器的起点。
但不确定如何进一步提取COMMON NAME from the leaf certificate证书链。
package main
import (
"crypto/tls"
"crypto/x509"
"io"
"io/ioutil"
"log"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
// Write "Hello, world!" to the response body
io.WriteString(w, "Hello, world!\n")
}
func main() {
// Set up a /hello resource handler
http.HandleFunc("/hello", helloHandler)
// Create a CA certificate pool and add cert.pem to it
caCert, …Run Code Online (Sandbox Code Playgroud) 我有一个程序,java.net.http.HttpClient它利用 Java 11 中引入的 来连接内部服务并向内部服务发送请求。这些服务相互验证,均提供内部 CA 颁发的证书。
例如,
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
KeyManager keys = /* load our cert and key */;
TrustManager trust = /* load our trusted CA */;
sslContext.init(keys, trust, secureRandom);
HttpClient.Builder builder = HttpClient.newBuilder().sslContext(sslContext);
HttpClient client = builder.build();
Run Code Online (Sandbox Code Playgroud)
在我们的主机上,客户端的证书和私钥会定期轮换,比主机或应用程序有机会重新启动的频率更高。我希望能够在新的证书/密钥对仍在运行时重新加载它,但看不到任何方法可以做到这一点HttpClient。SSLContext
构建完成后HttpClient,它仅提供一个sslContext()getter 来检索SSLContext. 似乎没有 API 来设置新的。
还有其他机制可以实现这一目标吗?
(我正在考虑类似于 Jetty 的SslContextFactory#reload(SSLContext)方法。)