我很新HTTPS/SSL/TLS,我对使用证书进行身份验证时客户端应该提供的内容有点困惑.
我正在编写一个Java客户端,需要为POST特定的数据执行简单的数据URL.那部分工作正常,唯一的问题是应该完成它HTTPS.该HTTPS部分相当容易处理(使用HTTPclient或使用Java的内置HTTPS支持),但我仍然坚持使用客户端证书进行身份验证.我注意到这里已经有一个非常类似的问题,我还没有用我的代码试过(很快就会这么做).我当前的问题是 - 无论我做什么 - Java客户端永远不会发送证书(我可以使用PCAP转储检查).
我想知道客户端在使用证书进行身份验证时应该向服务器提供什么内容(特别是对于Java - 如果这一点很重要)?这是一个JKS文件,还是PKCS#12?什么应该在他们身上; 只是客户端证书,还是密钥?如果是这样,哪个关键?对于所有不同类型的文件,证书类型等存在相当多的混淆.
正如我之前所说,我是新手,HTTPS/SSL/TLS所以我也会欣赏一些背景信息(不必是一篇文章;我会接受好文章的链接).
我正在设计一个RESTful Web服务,需要用户访问,还需要其他Web服务和应用程序访问.所有传入的请求都需要进行身份验证.所有通信都通过HTTPS进行.用户身份验证将基于身份验证令牌工作,通过将用户名和密码(通过SSL连接)POST 到服务提供的/ session资源获取.
对于Web服务客户端,客户端服务后面没有最终用户.请求由计划的任务,事件或一些其他计算机操作启动.连接服务列表事先已知(显然,我猜).我该如何验证来自其他(网络)服务的这些请求?我希望身份验证过程尽可能简单地实现这些服务,但不以安全为代价.对于这样的场景,标准和最佳实践是什么?
我能想到的(或者有人向我建议的)选项:
让客户服务使用"假的"用户名和密码,并以与用户相同的方式对其进行身份验证.我不喜欢这个选项 - 它感觉不对劲.
为客户端服务分配永久应用程序ID,也可能是应用程序密钥.据我所知,这与用户名+密码相同.使用此ID和密钥,我可以验证每个请求,或创建身份验证令牌以验证进一步的请求.无论哪种方式,我都不喜欢这个选项,因为任何能够获得应用程序ID和密钥的人都可以冒充客户端.
我可以在以前的选项中添加IP地址检查.这将使执行虚假请求变得更加困难.
客户证书.设置我自己的证书颁发机构,创建根证书,并为客户端服务创建客户端证书.但是,有几个问题浮现在脑海中:a)如何在没有证书的情况下允许用户进行身份验证,以及b)从客户端服务的角度来看,这种情况有多复杂?
还有别的 - 那里必须有其他解决方案吗?
我的服务将运行在Java上,但我故意遗漏了有关它将构建的具体框架的信息,因为我对基本原则更感兴趣,而不是对实现细节更感兴趣 - 我认为最好的解决方案是无论底层框架如何,都可以实现.但是,我对这个主题有点缺乏经验,所以对实际实现的具体提示和示例(例如有用的第三方库,文章等)也将非常感激.
authentication rest web-services restful-authentication client-certificates
我正在尝试为我的asp.net网站创建客户端证书身份验证.
为了创建客户端证书,我需要先创建一个证书颁发机构:
makecert.exe -r -n"CN = My Personal CA"-pe -sv MyPersonalCA.pvk -a sha1 -len 2048 -b 01/01/2013 -e 01/01/2023 -cy authority MyPersonalCA.cer
然后,我必须将其导入IIS 7,但由于它接受.pfx格式,我首先转换它
pvk2pfx.exe -pvk MyPersonalCA.pvk -spc MyPersonalCA.cer -pfx MyPersonalCA.pfx
Run Code Online (Sandbox Code Playgroud)
导入MyPersonalCA.pfx后,我尝试将https站点绑定添加到我的网站并选择上面的SSL证书,但是我收到以下错误:

有什么建议?
如何调试ssl握手,最好用curl?
我想使用客户端证书对每个目录身份验证进行故障排除.我特别想知道服务器发送哪些可接受的客户端证书.
提前致谢
我正在尝试Windows 8.1和Windows Phone 8.1的新功能,即证书存储和在服务器端使用客户端证书进行客户端身份验证的可能性.但是我遇到了这个功能的问题.
我有一个基本测试的WCF服务,它运行在IIS Express上.IIS express配置为支持SSL和客户端证书.在IIS(configurationhost.config)的配置文件中,我设置了这个:
<access sslFlags="SslRequireCert" /> (tried also SslNegotiateCert)
<clientCertificateMappingAuthentication enabled="true" />
Run Code Online (Sandbox Code Playgroud)
我在Windows RT应用程序中添加了客户端证书,如下所示:
//Install the self signed client cert to the user certificate store
string CACertificate = null;
try
{
Uri uri = new Uri("ms-appx:///Assets/AdventureWorksTestClient1.pfx");
var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);
IBuffer buffer = await FileIO.ReadBufferAsync(file);
using (DataReader dataReader = DataReader.FromBuffer(buffer))
{
byte[] bytes = new byte[buffer.Length];
dataReader.ReadBytes(bytes);
// convert to Base64 for using with ImportPfx
CACertificate = System.Convert.ToBase64String(bytes);
}
await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(
CACertificate,
"", …Run Code Online (Sandbox Code Playgroud) c# client-certificates windows-runtime windows-8.1 windows-phone-8.1
我正在尝试使用客户端证书来使用Web API对设备进行身份验证和授权,并开发了一个简单的概念证明来解决潜在解决方案的问题.我遇到的问题是Web应用程序没有收到客户端证书.一些人报告了这个问题,包括在本问答中,但没有一个人有答案.我希望提供更多细节来重振这个问题,并希望得到我的问题的答案.我对其他解决方案持开放态度.主要要求是用C#编写的独立进程可以调用Web API并使用客户端证书进行身份验证.
此POC中的Web API非常简单,只返回单个值.它使用一个属性来验证是否使用了HTTPS以及是否存在客户端证书.
public class SecureController : ApiController
{
[RequireHttps]
public string Get(int id)
{
return "value";
}
}
Run Code Online (Sandbox Code Playgroud)
以下是RequireHttpsAttribute的代码:
public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
};
}
else
{
var cert = actionContext.Request.GetClientCertificate();
if (cert == null)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "Client Certificate Required"
};
}
base.OnAuthorization(actionContext);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这个POC中,我只是检查客户端证书的可用性.一旦这个工作,我可以添加证书中的信息检查,以验证证书列表. …
c# security client-certificates ssl-certificate asp.net-web-api
我正在尝试在IIS 8上实现客户端证书身份验证.我已在开发计算机上部署了我的配置,并验证它在那里按预期工作.但是,在服务器上进行设置后,每当我导航到该站点并提示您输入客户端证书时,我都会选择它并立即收到403.16错误.失败的请求日志提供错误代码2148204809和消息"证书链已处理,但终止于信任提供程序不信任的根证书".
我有一个有效的客户端证书和一个有效的CA证书.CA证书安装在服务器和客户端计算机上的计算机帐户上的"受信任的根颁发机构"中,客户端证书安装在客户端计算机上的"当前用户"帐户的"个人"区域中.
客户端证书由根CA直接签名,正如我所说,两者都是有效的.链中没有其他证书,并且"受信任的根权限"区域中没有中间证书.
IIS配置已启用sslFlags = SslNegotiateCert和iisClientCertificateMappingAuthentication.
服务器未配置为发送CTL,我们有SendTrustedIssuerList = 0.
我不明白为什么不应该信任客户端证书.
我想在我的Android/iOS应用程序和可访问Internet的后端服务之间进行安全通信,因此我正在调查HTTPS/SSL.
如果我创建自签名的证书,然后把一个客户证书中的应用,并导致后端服务,要求该客户端证书,这是真正安全的?
这就是我要问的原因.似乎客户端证书可以通过询问.apk来"入侵".客户端证书只是一个字符串常量,对吧?这意味着任何人都可以使用客户端证书来访问我的后端..apk(和iOS等价物)是否足够不透明以防止发现客户端证书?
我正在尝试在IIS7上运行的Web应用程序上设置双向身份验证.客户端主要是移动设备,首先我试图使用第三代iPad运行演示.我以为我首先要让它在我的工作站上运行(也运行IIS),然后通过iPad复制工作证书.
但是我撞墙了.
我已经让网站通过https安全运行并安装了自签名服务器证书,但我似乎无法弄清楚如何生成我可以在iPad上安装的客户端证书.当我在运行Windows 7的本地工作站上工作时,我无法使用通常的方法http://machinename/CertSvr来执行此操作.
所以我想知道是否有办法makecert生成测试客户端证书,或者我是否可以更改服务器证书中的使用标志,使其适合在客户端上使用.或者也许还有一些工具,谷歌的最后一天还没有发现?
更新:
我找到了这个指南并跟着它来了.这一切似乎工作,没有错误,我结束了两个PFX文件,一个用于服务器和一个客户端(我产生这些使用pvk2pfx,并保持原有的.pvk和.cer以防万一的文件).
我安装了服务器证书Certificates (Local Computer) > Trusted Root Certification Authority并在其下安装了客户端证书Certificates (Current User) > Personal.我还将服务器证书(CA一个)导入IIS.当IIS配置为接受或忽略客户端证书时,一切正常.但是一旦设置为'Require',我在申请该网站时会得到403.7.我也尝试将客户端证书导入到IE/Chrome中的证书存储区,但同样没有骰子.
有什么明显的东西我做错了吗?
为未来的读者编辑:不幸的是,获得赏金的答案不起作用; 我现在无能为力.但是请在下面阅读我自己的答案(通过测试) - 确认可以使用最少的代码更改
我们有一个完全在ASP.NET WebAPI 2.2中的Azure云服务(WebRole)(没有MVC,前端是Angular).我们的一些控制器/ REST端点通过SSL(客户端证书身份验证/相互身份验证)与第三方云服务通信,其余控制器/端点与HTML5/AngularJS前端通信,也通过SSL(但更传统的服务器身份验证) SSL).我们没有任何非SSL端点.我们通过云服务启动任务启用了客户端SSL,例如:
IF NOT DEFINED APPCMD SET APPCMD=%SystemRoot%\system32\inetsrv\AppCmd.exe
%APPCMD% unlock config /section:system.webServer/security/access
Run Code Online (Sandbox Code Playgroud)
问题:该设置是站点范围的,所以即使用户点击第一页(比如https://domain.com,返回angular.html的index.html),他们的浏览器也要求他们提供客户端SSL证书.(下图)
如果有办法要么
要么
我们的服务器的web.config很复杂,但相关的代码片段如下:
<system.webServer>
<security>
<access sslFlags="SslNegotiateCert" />
</security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
并且客户端的屏幕截图访问常规WebAPI端点但仍在尝试客户端SSL身份验证(在任何浏览器,Chrome,Firefox或IE中都会发生)
