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

想象以下情况:
您需要从访问您的网站的用户那里获取一个密钥(在非对称情况下为用户的公共密钥 ),并希望浏览器记住私有部分,而不会因冗长的导入过程而困扰用户。 老实说,实际上,您甚至不希望用户处理加密详细信息,这些详细信息是许多用户无法知道或不正确知道的。 它应该简单地工作,并且在最佳情况下,用户甚至都不应该注意到加密正在发挥作用! 想象一下,例如,一个企业范围的证书颁发机构 ,员工可以在其中申请证书或续订登录到公司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,一经查实,立即删除!

相关文章

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…

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…

【校招面试 之 网络】第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] // 读 } }(…

java 递归从子节点删除父节点_LeetCode450. 删除二叉搜索树中的节点

删除一个二叉搜索树中的节点&#xff0c;需要进行情况的分类讨论&#xff0c;看一下将这个节点删除之后是否需要对二叉搜索树进行调整&#xff08;为了保持树的连接和维持二叉搜索树的性质&#xff09;。&#xff08;1&#xff09;如果删除的是一个叶子节点&#xff0c;那问题不…

1. [文件]- 文件类型,文件open模式

1.文件类型&#xff1a;文本文件和二进制文件 硬盘中的文件保存为01010101格式&#xff0c;一般读取文件是把文件从硬盘中读取到内存中。 文本文件需要进行格式转换才能读取出来。二进制文件一般用于传输二进制文件&#xff1a;视频图片 2.文件打开模式 几种不同的读取和遍历文…

node安装node-sass失败,配置淘宝源

node-sass 安装失败的原因是因为无法下载 .node 文件&#xff0c;解决办法就很简单了&#xff0c;就是我们把文件下载路径复制一份到浏览器里&#xff0c;然后使用浏览器下载文件就可以了。 具体方法 1.从node命令行中复制 .node文件下载链接并在浏览器打开下载文件https:/…

带有Atomikos示例的Tomcat中的Spring JTA多个资源事务

在本教程中&#xff0c;我们将向您展示如何使用Atomikos Transaction Manager在Tomcat服务器中实现JTA多个资源事务。 Atomicos事务管理器为分布式事务提供支持。 这些是多阶段事务&#xff0c;通常使用多个数据库&#xff0c;必须以协调的方式提交。 分布式事务由XA standard描…

mac vs 返回上一步_mac电脑打不开应用程序的解决方法

mac电脑跟windows电脑一样&#xff0c;经常会出现打不开应用程序的情况&#xff0c;并且提示“因为它来自身份不明的开发者”&#xff0c;也不知道哪里出现问题&#xff1f;由于MAC系统与windows界面不一样&#xff0c;很多小编不懂怎么操作&#xff1f;为此&#xff0c;小编给…

iOS-----------关于组件化

打一个比较形象的比喻&#xff0c;把APP比作我们的人体&#xff0c;把胳膊、大腿、心、肝、肺这些人体器官比作组件&#xff0c;各个器官分别负责他们各自的功能&#xff0c;但是他们之间也有主次之分&#xff0c;试想我们的胳膊、大腿等是不能独立完成某个任务的&#xff0c;必…

android 自定义switch控件,Android中switch自定义样式

android 原生开关按钮控件 Switch 提供样式自定义方式&#xff0c;可供我们修改为适合我们开发使用的样式控件&#xff0c;自定义样式过程如下:自定义switch切换drawable新建swith_thumb.xml文件自定义switch轨道drawable新建switch_track.xmln文件,轨迹如果在选中与否过程并没…

具有瞬态属性的视图对象的钝化和激活

在应用程序模块的钝化/激活周期内&#xff0c;框架也会钝化并激活视图对象。 通常&#xff0c;框架保存有关VO状态&#xff0c;当前行&#xff0c;绑定变量值等的信息。 但是没有数据。 激活视图对象后&#xff0c;将重新执行VO的查询&#xff0c;并重新获取数据。 在大多数情况…

pre标签的样式

你可能正在使用 <pre> 标签。这是一个 HTML 中非常特别的标签&#xff0c;它允许其中的空格真正显示出来。例如&#xff1a;四个空格将真实显示成四个空格。这不同于其他标签通常的做法&#xff0c;其他标签会将之间的空白压缩成一个。从这一点来说&#xff0c;<pre&g…