我正在尝试从HTTP请求访问我的Web API中的客户端证书.我附上证书如下:
X509Certificate2 clientCert = GetClientCertificate();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://localhost:44366/test");
request.KeepAlive = true;
request.Method = "GET";
request.Accept = "application/json";
request.ClientCertificates.Clear();
request.ClientCertificates.Add(clientCert);
var response = (HttpWebResponse) request.GetResponse();
Run Code Online (Sandbox Code Playgroud)
在哪里GetClientCertificate()访问本地安装的证书.从我的WebApi内部,我有以下路线:
[HttpGet]
[Route("test")]
public HttpResponseMessage TestNoAuth()
{
X509Certificate2 cert = Request.GetClientCertificate();
return cert == null ? Request.CreateResponse(HttpStatusCode.BadRequest, "No cert") : Request.CreateResponse(HttpStatusCode.OK, "Cert attached");
}
Run Code Online (Sandbox Code Playgroud)
无论我尝试什么,cert总会回来null.我是否错误地附加了证书,或者尝试错误地访问它?我已经用这条测试路线创建了一个全新的WebAPI,以确保我们的开发API中没有可能存在冲突的设置.任何帮助将不胜感激.
我正在尝试对第三方服务器执行 cUrl。他们为我提供了一个 p12 文件,我将其安装在浏览器中。使用浏览器时,我收到服务器的响应。从 Linux 终端执行 cUrl 时,出现握手错误。
我将 .p12 提取到密钥和证书,然后运行以下命令:
curl --key client.key --cert client.crt -X GET -v https://x.x.x.x:xxxx/folder/endpoint
并得到如下回复:
Note: Unnecessary use of -X or --request, GET is already inferred.
* Trying x.x.x.x...
* TCP_NODELAY set
* Connected to x.x.x.x (x.x.x.x) port xxxx (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello …Run Code Online (Sandbox Code Playgroud) 另一个线程指出了一些需要客户端 MTLS 证书、接受任何证书、然后使用有关 SSL 握手/证书的信息进行响应的服务。
这些端点都返回 HTML。有谁知道类似的返回 application/json 的东西吗?
我最近经历了一个非常艰巨的过程来构建一些应该非常简单但在任何一个地方看起来基本上都找不到的东西.我想尝试把所有内容都放在这里询问我是否做错了,如果没有,请帮助那些需要这些信息的人.
背景:我试图提供安全性的产品/服务是围绕Windows服务器上的WCF服务构建的,只能通过PC或iPad上的自定义客户端应用程序访问.每个客户一台服务器,无浏览器访问权限 使用Windows标准机制和来自商业CA的证书,所有内容都已通过身份验证和授权进行TLS保护.
为了进一步限制访问,使用自签名证书为Windows平台实现了客户端/服务器证书(在没有公共/浏览器访问的相互身份验证的情况下不需要商业CA--尽管声称相反 - 并且它们更难管理).
让所有这些对iPad起作用是一个非常有记录的噩梦,有大量的虚假信息或部分正确的建议.在接下来的内容中,我尝试链接到最佳来源,但如果我无意中错过了归因,我会道歉.如果这篇文章有任何错误/误导,请发表评论.
谢谢
我想使用TLS相互身份验证来验证在go中制作的API上的客户端.我已经创建了一个证书颁发机构,让我们说Bob有一个他希望与客户端一起使用的密钥对.Bob创建了一个证书请求,并希望我验证他的证书,以便在API上进行授权和身份验证.
我用它来创建我的证书颁发机构:
openssl genrsa -aes256 -out ca.key 4096
openssl req -new -x509 -sha256 -days 730 -key ca.key -out ca.crt
Run Code Online (Sandbox Code Playgroud)
Bob用它来创建他的证书和证书请求:
openssl genrsa -out bob.key 4096
openssl req -new -key bob.key -out bob.csr
Run Code Online (Sandbox Code Playgroud)
我想得到这个,但是在去:
openssl x509 -req -days 365 -sha256 -in bob.csr -CA ca.crt -CAkey ca.key -set_serial 3 -out bob.crt
Run Code Online (Sandbox Code Playgroud)
现在,使用theses命令,Bob可以创建一个到我的API的TLS连接,使用这个tls.Config:
func createTLSConfig(certFile string, keyFile string, clientCAFilepath string) (config *tls.Config, err error) {
cer, err := tls.LoadX509KeyPair(certFile, keyFile)
if err != nil {
return nil, err
}
clientCAFile, err := ioutil.ReadFile(clientCAFilepath) …Run Code Online (Sandbox Code Playgroud) 我正在尝试从客户端浏览器检索客户端证书以验证用户身份.我知道我可以创建一个与控制器同名的文件夹,并使用IIS将其SSL设置设置为需要客户端证书.事实上,我已经尝试了这个并且它有效,但是我不能采用这种方法,因为控制器内部还有其他操作,不需要向用户询问客户端证书.另外我需要在不同的控制器中询问客户端证书.
那么,您是否知道提示用户选择客户端证书的干净(如果可能)方式?
我正在尝试在Linux服务器和Android APP之间建立一个相互认证的SSL.到目前为止,我已经能够让应用程序使用服务器证书通过SSL进行通信,但是一旦我将服务器设置为仅接受客户端证书就停止工作.服务器配置似乎没问题,但我有点卡住了.我最好的猜测是客户端证书没有正确呈现给服务器,但不知道如何测试它.我尝试在我的OS X钥匙串中使用.pem作为客户端,但浏览器似乎不能使用该证书.然后,服务器证书再次完美,因为我可以实现https连接,APP接受我的未签名服务器证书.
我正在使用的代码是各种教程的组合,答案这是我收藏的主要内容:
这是我用于连接的两个主要类:1)此类处理JSON解析并执行请求
package edu.hci.additional;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
import android.content.Context;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
// function get json from url
// …Run Code Online (Sandbox Code Playgroud) 目前我正在开发一个使用相互身份验证的应用程序,以便与REST接口进行通信.因为我对这个主题很陌生,所以我研究了几个例子 - 现在我有一些问题.我希望我能够将所有知识片段放在一起,以便更好地了解整个过程.
该过程应如下所示:
我用于为第一个请求执行SSL固定的代码如下所示,SSL Pinning按预期工作.
- (void)connection:(NSURLConnection *)connection
willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server-cert" ofType:@"cer"];
SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, 0);
NSData *remoteCertificateData = CFBridgingRelease(SecCertificateCopyData(certificate));
NSData *localCertificateData = [NSData dataWithContentsOfFile:cerPath];
if ([remoteCertificateData isEqualToData:localCertificateData]) {
NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:[challenge protectionSpace]];
NSLog(@"Certificate Pinning Succeeded");
} else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
NSLog(@"Certificate Pinning Failed");
}
}
Run Code Online (Sandbox Code Playgroud)
但是如何处理来自服务器的返回证书?据我所知,我必须使用以下NSURLConnection委托方法 - 并以某种方式向服务器提供此证书(用于进一步的请求).
- (BOOL)connection:(NSURLConnection *)connection …Run Code Online (Sandbox Code Playgroud) 我正在构建一个需要相互身份验证的应用程序。因此,我将允许我的用户上传一堆客户端证书,当他们拨打电话时,他们可以使用其中任何一个。我将匹配传入请求中的客户端证书,以查看它是否与已存储的任何证书匹配,如果匹配,则该请求将得到满足。
现在我正在尝试找出存储这些客户端证书的最佳方法。我在想我可以将它们存储在数据库中,或者某种文件/blob 存储中,或者我了解到它们也可以安装在机器的存储中?
这些选项中哪一个是理想的或被认为是最佳实践?
存储客户端证书的最佳实践是什么?
编辑:我的服务器实际上在带有 IIS 的 Windows 计算机上运行一项服务,其他用户将使用该服务。
security ssl certificate x509certificate mutual-authentication
我需要知道如何在c#中进行相互认证.我知道在WCF应用程序中它非常简单.但是,我必须从C#中的控制台应用程序进行双向SSL身份验证.我有两个客户端和服务器的公共证书.
任何帮助,将不胜感激!