基于浏览器的密钥生成以及与浏览器的密钥/证书存储的交互

想象以下情况:
您需要从访问您的网站的用户那里获取一个密钥(在非对称情况下为用户的公共密钥 ),并希望浏览器记住私有部分,而不会因冗长的导入过程而困扰用户。 老实说,实际上,您甚至不希望用户处理加密详细信息,这些详细信息是许多用户无法知道或不正确知道的。 它应该简单地工作,并且在最佳情况下,用户甚至都不应该注意到加密正在发挥作用! 想象一下,例如,一个企业范围的证书颁发机构 ,员工可以在其中申请证书或续订登录到公司Webmail系统所需的证书。 这不是员工主要任务的一部分,因此该过程必须简单,快速并且无需阅读任何内容。 非常感谢(或本例中为Netscape )HTML,因为HTML 5甚至是独立于浏览器的,也是官方标准的一部分,带有专用于密钥生成的标签: <KeyGen />。 简而言之,标记可以强制用户的浏览器创建非对称密钥对,对相应的公共密钥和服务器提供的质询进行签名,最后将其发送回服务器(更确切地说,发送至表单操作中定义的位置)属性)。 私钥会自动加密并存储在浏览器的密钥存储区中。 用于公共密钥,质询和签名封装的格式称为SPKAC 。 如果服务器以X.509证书作为响应,则证书直接链接到私钥并存储在浏览器的证书存储区中。 结果,浏览器现在拥有服务器提供的(可能是新创建的)证书和相应的私钥。 所有这些只需单击一次提交按钮即可。 (是的,也许用户还应该在表单字段中添加一些详细信息……)这是在Java中的操作方法。 为了简单起见,我们将通过直接注册为Servlet在服务器端使用快速且肮脏的解决方案。

首先,我们将从初始网站开始,该网站提供一个表格,其中必须输入证书申请者的一些详细信息。 请注意,这些表单域不是由签名与新生成私钥保护! 此签名仅保护公共密钥,而在这种情况下(为简单起见)它是硬编码的,但是必须是服务器在现实世界中选择的新值,才能保护挑战。 因此,必须保护两者:网站的交付(包括表单)(它包含安全性关键值,挑战,表单操作……必须受到完整性保护)以及将数据传输回服务器。 再一次, 如果您无法保护通信并至少确保安全目标的完整性,那么攻击者可能会破坏您的整个安全概念!

<form action="CreateCertificate" method="POST">
<table><tbody><tr><td>Country name</td><td>C</td><td><input name="c" type="text" value="" /></td></tr><tr><td>Common name</td><td>CN</td><td><input name="cn" type="text" value="" /></td></tr><tr><td>Organizational unit</td><td>OU</td> <td><input name="ou" type="text" value="" /></td></tr><tr><td>Organization</td><td>O</td><td><input name="o" type="text" value="" /></td></tr><tr><td></td><td><keygen challenge="replaceMe" keyparams="2048" keytype="rsa" name="newSPKAC"></keygen></td><td><input type="submit" value="Generate!" /></td></tr></tbody>
</table>
</form>

在服务器端,必须为表单操作目标注册一个处理类。 这是在您的web.xml配置文件中完成的。

<web-app version="3.0" xmlns:xsi="..." xmlns="..." xsi:schemalocation="..."><servlet><servlet-name>CreateCertificate</servlet-name><servlet-class>com.blogspot.armoredbarista.examples.certificates.CreateCertificate</servlet-class></servlet><servlet-mapping><servlet-name>CreateCertificate</servlet-name><url-pattern>/CreateCertificate</url-pattern></servlet-mapping><session-config><session-timeout>30</session-timeout></session-config>
</web-app>

这将导致对路径/ CreateCertificate的任何调用均由CreateCertificate类处理。 反过来,CreateCertificate类执行名称中所期望的操作:它创建一个证书,其中包括收到的公共密钥和请求者的详细信息。 公钥和质询包含在SPKAC结构中,该结构由KeyGen标签创建(在这种情况下,此名称由名称newSPKAC标识)。

public class CreateCertificate extends HttpServlet {/*** Processes requests for both HTTP GET and POST methods.** @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void processRequest(final HttpServletRequest request,final HttpServletResponse response)throws ServletException, IOException {OutputStream out = response.getOutputStream();byte[] content = "An error occured".getBytes("UTF-8");try {String c = request.getParameter("c");String cn = request.getParameter("cn");String o = request.getParameter("o");String ou = request.getParameter("ou");String newSPKAC = request.getParameter("newSPKAC");X509Certificate cert = createCertificate(c, cn, ou, o, newSPKAC);content = cert.getEncoded();response.setContentType("application/x-x509-user-cert");response.setHeader("Pragma", "No-Cache");response.setDateHeader("EXPIRES", -1);} catch (...) {// error processing} finally {out.write(content);out.flush();out.close();}}/*** Handles the HTTP* GET method.** @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/@Overrideprotected void doGet(final HttpServletRequest request,final HttpServletResponse response)throws ServletException, IOException {processRequest(request, response);}/*** Handles the HTTP* POST method.** @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/@Overrideprotected void doPost(final HttpServletRequest request,final HttpServletResponse response)throws ServletException, IOException {processRequest(request, response);}
}

在这种情况下,用于响应的ContentType是application / x-x509-user-cert。

就这样。 用户输入详细信息并单击按钮后,他应该在浏览器的证书存储中找到新证书:

关于SPKAC 轻巧拆卸的最后一句话: BouncyCastle可以帮助您与ASN.1和DER野兽战斗!

参考: Java安全和相关主题博客中的JCG合作伙伴 Christopher Meyer, 基于浏览器的密钥生成以及与浏览器的密钥/证书存储的交互 。

翻译自: https://www.javacodegeeks.com/2013/06/browser-based-key-generation-and-interaction-with-the-browsers-keycertificate-store.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个简单的前端事件框架

参考网上的一个资料&#xff0c;做下备注。 <html><head><title>js event demo</title><meta http-equiv"pragma" content"no-cache"><meta http-equiv"cache-control" content"no-cache"><me…

linux制作一键恢复,Linux/Centos Mondo 一键部署、镜像恢复,快速部署

1.环境准备image.png2.安装mondocurl -o /etc/yum.repos.d/mondorescue.repo ftp://ftp.mondorescue.org/rhel/7/x86_64/mondorescue.reposed -i s#gpgcheck1#gpgcheck0#g /etc/yum.repos.d/mondorescue.repoyum -y install mondosed -i s#EXTRA_SPACE150000#EXTRA_SPACE650000…

转载:pycharm最新版新建工程没导入本地包问题:module 'selenium.webdriver' has no attribute 'Firefox'...

pycharm最新版新建工程没导入本地包问题&#xff1a;module selenium.webdriver has no attribute Firefox 前言 最新版的pycharm做了很大的改变&#xff0c;新建工程的时候&#xff0c;默认不导入本地的安装包&#xff0c;这就导致很多小伙伴踩坑了。。。明明已经pip安装过sel…

chrome 开发者工具,查看元素 hover 样式

在web开发中&#xff0c;浏览器开发者工具是我们常用的调试工具。我们经常会有这样的需求&#xff0c;就是查看元素的时候需要查看它的hover样式。相信有很多小伙伴都遇到过这样的情形&#xff0c;始终选不中hover后的元素状态。其实在开发者工具中是有地方可以设置的。方法如下…

.net ad域登录 form认证_golang|给Gitbook做个认证代理

后台管理系统嵌入了Gitbook做帮助中心&#xff0c;需要给Gitbook添加下认证。思路如下&#xff1a;修改Gitbook发布时的js&#xff0c;给每个URL拼接上用户登录后的Token&#xff0c;Gitbook前面有个代理获取这个Token&#xff0c;Token验证成功&#xff0c;则将请求发送给Gitb…

将亚型多态性与通用多态性相关联的危险

Java 5已将通用多态性引入Java生态系统。 即使我们都知道由于泛型类型擦除及其后果而引起的无数警告&#xff0c;这对Java语言还是一个很大的补充。 通用多态性&#xff08;也称为参数多态性 &#xff09;通常与可能预先存在的亚型多态性正交。 一个简单的例子是collections AP…

strtoul()要优于atoi()函数---C语言

strtoul()&#xff1a;将字符串转为长整型整数 atoi()&#xff1a;将字符串转为整型整数 在32位STM32中&#xff0c;int是32位的&#xff0c;如果字符串是“3123456789”&#xff0c;大于0x7fff fff&#xff0c;用atoi()函数返回的值就是0x7fff fff&#xff0c;而使用strtoul就…

Web前端行业的机遇与自我规划,如果你对未来没有方向 不如看一看,或许就是一道曙光!

本篇是来自西安前端开发者分享社区的经验分享&#xff0c;给出前端工作人员在行业中的发展建议&#xff0c;如果我们没有目标时候 不妨看看别人是怎么做的&#xff01; 感谢西安前端开发者分享社区的分享&#xff01; 资源下载&#xff1a;来自示说网平台&#xff08;https://…

中职升高职c语言程序设计教程课后答案,中职C语言教学创新与实践论文

中职C语言教学创新与实践论文摘要&#xff1a;自主学习体现了以学生为中心、以人为本的教学思想&#xff0c;是一种行之有效的教学方法&#xff0c;但中职学生自主学习能力整体比较欠缺&#xff0c;学生怕学、厌学现象严重&#xff0c;给教师的教学带来一定的难度。文章以C语言…

cv岗工作做什么_职场速递:我应该做什么工作?

我曾经7年换过6份工作&#xff0c;转行3次&#xff0c;只是因为一直纠结于&#xff1a;到底什么才是我想要的工作。我和很多职场人一样&#xff0c;在“我想做的&#xff0c;我喜欢的”和“我能做的&#xff0c;能养活我的”选项之间迷惘过。大部分人提起自己工作的时候&#x…

用Java和Java 8创建内部DSL,采用Martin Fowler的方法

目前&#xff0c;我正在阅读Martin Fowler撰写的有关DSL- 特定于域的语言的精彩书籍。 围绕DSL的嗡嗡声&#xff0c;围绕轻松支持DSL创建的语言&#xff0c;以及DSL的使用使我好奇地了解和了解DSL的这一概念。 到目前为止&#xff0c;这本书的使用经验令人印象深刻。 马丁福勒…

【VSCode】Windows下VSCode便携式c/c++环境

http://blog.csdn.net/c_duoduo/article/details/52083494 Ver 1.1 完整版&#xff08;修复mingw环境变量错误&#xff09;下载&#xff1a; http://pan.baidu.com/s/1jIwZcUU 转载于:https://www.cnblogs.com/shiningrise/p/8401644.html

【校招面试 之 网络】第3题 HTTP请求行、请求头、请求体详解

1、HTTP请求报文解剖 HTTP请求报文由3部分组成&#xff08;请求行请求头请求体&#xff09;&#xff1a; 下面是一个实际的请求报文&#xff1a; ①是请求方法&#xff0c;GET和POST是最常见的HTTP方法&#xff0c;除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过&a…

奇妙的 CSS shapes(CSS图形)

CSS 发展到今天已经越来越强大了。其语法的日新月异&#xff0c;让很多以前完成不了的事情&#xff0c;现在可以非常轻松的做到。今天就向大家介绍几个比较新的强大的 CSS 功能&#xff1a; clip-pathshape-outside shape 的意思是图形&#xff0c;CSS shapes 也就是 CSS 图形…

c++ map 多线程同时更新值 崩溃_深入理解并发安全的 sync.Map

golang中内置了map关键字&#xff0c;但是它是非线程安全的。从go 1.9开始&#xff0c;标准库加入了sync.Map&#xff0c;提供用于并发安全的map。普通map的并发问题map的并发读写代码func main() { m : make(map[int]int) go func() { for { _ m[1] // 读 } }(…

CS Academy Round #65 Count Arrays (DP)

题目链接 Count Arrays 题意 给定$n$和$m$个区间。若一个长度为$n$的$01$序列满足对于每一个给定的区间中至少有一个位置是$0$&#xff0c; 那么这个$01$序列满足条件。求有多少满足条件的$01$序列。 设$f[i]$为考虑到第$i$位的时候&#xff0c;有多少满足条件的$01$序列。 则…

c语言中栈堆,C语言中堆和栈的区别

二.堆和栈的区别1.申请方式(1)栈(satck):由系统自动分配。例如&#xff0c;声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间。(2)堆(heap):需程序员自己申请(调用malloc,realloc,calloc),并指明大小&#xff0c;并由程序员进行释放。容易产生memory leak.eg:char p;…

webview部分安卓机中文乱码

在开发过程中需要加载html片断&#xff0c;发现安卓机上是乱码&#xff0c;这可郁闷了&#xff0c;官方文档也没有这方面的介绍&#xff0c;还好度娘还好的&#xff0c;记录一下解决方案&#xff1a; 其实很简单&#xff0c;只在source对象中添一个属性baseUrl为空就可以解决&a…

MongoDB存储基础教程

一、MongoDB简介 1. mangodb是一种基于分布式、文件存储的非关系型数据库   2. C写的&#xff0c;性能高   3. 为web应用提供可扩展的高性能数据存储解决方案   4. 所支持的格式是json格式 二、MongoDB三元素&和关系型数据库的区别 三元素&#xff1a;数据库 集合(类…

Tomcat的带有守护程序和关闭挂钩的正常关闭

我的最后两个博客讨论了长时间轮询和Spring的DeferredResult技术&#xff0c;并且为了展示这些概念&#xff0c;我将我的Producer Consumer项目中的代码添加到了Web应用程序中。 尽管该代码演示了博客所提出的观点&#xff0c;但其逻辑上确实包含大量漏洞。 除了在实际的应用程…