标签: mutual-authentication

使用客户端证书的自定义urllib开启工具

我有一个我必须使用的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)

python ssl https pyopenssl mutual-authentication

5
推荐指数
1
解决办法
6910
查看次数

在 Azure Api 管理中保护 WebApi

我已经在 Azure 网站上部署了我的 webapi 并通过 Azure Api 管理门户公开它。我想阻止对 azurewebsites url 的访问,以便用户只能通过安全密钥通过 azure aoi 管理代理访问我的 api。你能否解释一下如何做到这一点。我听说可以使用相互证书,但在网上找不到任何描述创建此类证书和配置 web api 以有效使用它们的过程的文章。我的第二个问题是,是否有一种机制可以根据用户名/密码和产品名称获取 Api 主键。关于保留该 api 访问密钥的最佳方法是什么。客户端应用程序是否应该将其存储在某个配置文件中,并且应该在运行时以编程方式获取?

非常感谢

azure asp.net-web-api mutual-authentication azure-api-management

5
推荐指数
1
解决办法
2955
查看次数

是否可以使用aws api网关进行相互认证?

我在tomcat中安装了一个应用程序,目前我在http上运行.我也使用AWS API网关来公开我的应用程序.我想在aws api网关和我们创建的api之间实现相互认证.有没有我可以参考的文件.也可以使用AWS API网关和我的api实现相互身份验证.

api amazon-web-services tomcat7 mutual-authentication aws-api-gateway

5
推荐指数
1
解决办法
3251
查看次数

AWS Lambda中的相互身份验证(2-way SSL)

我正在为小型PoC构建AWS Lambda服务。PoC中的流程为:

  • 通过POST输入(文本),
  • 执行一个小的字符串操作+
  • 将操纵值存储到DynamoDB中,然后
  • 通过HTTP POST将相同(操纵)的值发送到特定的URL

看起来像一个简单的lambda教程示例,但是对我来说棘手的部分是授权。我必须发布的URL仅允许通过SSL证书相互认证的请求。如何在Lambda中实现这一目标?

我找不到足够的答案来完成这项工作。我看过使用AWS API网关2路ssl cert选项。但是,要使其正常工作,我需要将接收部件证书安装到证书存储中。可能吗?还是唯一的方法是使用微型EC2盒?

在Lambda,我可以使用Node.JS,Java或Python。

java ssl lambda amazon-web-services mutual-authentication

5
推荐指数
1
解决办法
1028
查看次数

如何在远程加载客户端证书的iOS中实现SSL相互身份验证?

我正在尝试在iOS应用中实现SSL相互身份验证.在我看到的大多数示例中,客户端证书与应用程序包捆绑在一起.但在我的情况下,我需要远程加载客户端证书(即,从链接或通过电子邮件).

如果我尝试从外部源(即邮件应用程序)加载证书,它会导航到设置应用程序并将其安装到苹果的钥匙串.因此,我的应用无法访问此证书.

所以有人请为此提出建议吗?

ssl ios mutual-authentication

4
推荐指数
1
解决办法
1677
查看次数

使用客户端证书发出HTTP请求而不在机器上安装PFX?

我有一个小型控制台应用程序,它使用客户端证书来创建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.如果无法做到这一点,有人可以提供解释为什么我们不能这样做的任何机会?

c# ssl client-certificates x509 mutual-authentication

3
推荐指数
1
解决办法
3232
查看次数

当客户向您提供他们的公共证书时进行相互身份验证

通常,2 路 ssl 又名相互身份验证包括生成服务器 ca 密钥和证书等。然后客户端生成一个 CSR,将其提供给您,您签署他们的 CSR 并向他们提供客户端证书。

然而,

我遇到过一种情况,客户要求我通过交换彼此的 x509 公共证书来实现“相互身份验证”。这个听说过吗?也许称为“2 路 SSL”或“相互身份验证”以外的名称。

我正在努力寻找与 openssl 有关的任何文档或信息。

openssl ssl-certificate mutual-authentication

3
推荐指数
1
解决办法
7103
查看次数

使用 mTLS 进行 GKE gRPC 入口运行状况检查

我正在尝试使用双向 TLS 身份验证在 GKE (v1.11.2-gke.18) 上实现 gRPC 服务。

当不强制执行客户端身份验证时,GKE 自动创建的 HTTP2 运行状况检查会响应,并且一切都连接问题。

当我打开相互身份验证时,运行状况检查失败 - 大概是因为它无法完成连接,因为它缺少客户端证书和密钥。

与往常一样,文档很简单而且相互矛盾。我需要一个完全编程的解决方案(即没有控制台调整),但除了手动将运行状况检查更改为 TCP 之外,我一直无法找到解决方案。

从我所见,我猜我要么需要:

  • 实施自定义 mTLS 运行状况检查,以防止 GKE 自动创建 HTTP2 检查
  • 找到一种替代方法在不使用service.alpha.kubernetes.io/app-protocols: '{"grpc":"HTTP2"}'专有注释的容器上进行 SSL 终止
  • 找到某种方法为健康检查提供所需的凭据
  • 改变我的 go 实现,以某种方式在不需要 mTLS 的情况下进行健康检查,同时在所有其他端点上强制执行 mTLS

或者也许还有其他我没有考虑过的东西?下面的配置非常适用于带有 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

3
推荐指数
1
解决办法
1203
查看次数

从 golang 中传入的 https 请求中提取通用名称

我的 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)

go mutual-authentication tls1.2

3
推荐指数
1
解决办法
2350
查看次数

重新加载 java.net.http.HttpClient 的 SSLContext

我有一个程序,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)

在我们的主机上,客户端的证书和私钥会定期轮换,比主机或应用程序有机会重新启动的频率更高。我希望能够在新的证书/密钥对仍在运行时重新加载它,但看不到任何方法可以做到这一点HttpClientSSLContext

构建完成后HttpClient,它仅提供一个sslContext()getter 来检索SSLContext. 似乎没有 API 来设置新的。

还有其他机制可以实现这一目标吗?

(我正在考虑类似于 Jetty 的SslContextFactory#reload(SSLContext)方法。)

java ssl mutual-authentication java-http-client

3
推荐指数
1
解决办法
6385
查看次数