SSL/TLS 中的相互身份验证

2024-01-04

我是 SSL 身份验证的新手,我需要使用 SSL 在信任边界上对两个架构组件进行身份验证(我可以控制这两个组件)。我想我需要两种方式的 SSL 身份验证,服务器和客户端都有证书。

证书可以自签名吗? (即由供应商签名,这不会首先使使用 SSL 无效?或者我是否需要第三方验证服务来确保证书的身份?)

服务器和客户端的公钥和私钥握手如何工作?

我必须在 IIS 中配置服务器以使用证书,并随请求发送客户端证书(最有可能通过使用 WCF 进行配置?),但是我还需要执行其他任何任务才能完成这项工作吗?


我同意 EJP 的答案,但由于您接受了不同的答案,因此以下是有关自签名证书问题的更多详细信息。

可以在您的服务器上使用自签名证书。您只需配置所有潜在客户端即可使用信任此证书。这可以通过将证书(没有私钥)导入到每台计算机的受信任存储中或浏览器的受信任证书存储库中(例如,Firefox 使用自己的证书,独立于其运行的操作系统)来完成。这里的自签名服务器证书主要是自定义 CA 证书的特例,其中每个客户端都需要了解它可能使用的每个服务器(缺点是自签名证书无法撤销)。这没问题,但实际上,如果您拥有的机器不多,这很快就会成为问题。

您的主要问题将与自签名证书有关client证书。

客户端证书身份验证由服务器发起,服务器向客户端发送 TLS 证书请求消息。该消息包含它愿意接受的证书颁发机构的名称列表。然后,客户端使用此列表来选择要发送的证书:它们查找具有与此 CA 列表中的名称之一匹配的颁发者 DN 的证书(它们拥有私钥)(它们也可以使用证书链,如果中间 CA需要证书才能链接到此 CA 列表中的颁发者 DN)。

如果大多数客户端找不到符合这些条件的证书,则根本不会发送任何客户端证书。当尝试使用自签名客户端证书时,这将是最大的问题。

解决此问题的一种方法是让服务器发送一个空列表。这为客户端提供了更多选择证书的自由(然后由服务器选择是否接受它,但无论如何情况总是如此)。这是 TLS 1.1 明确允许的,之前的版本 (SSLv3/TLS 1.0) 在这个主题上保持沉默,但在实践中,据我所知,它也适用于大多数 SSLv3/TLS 1.0 堆栈。 (例如,当浏览器自动选择证书时,这仍然可能导致交互笨拙,因为它很难正确地进行自动选择。)

Java's X509TrustManager可以使用定制getAcceptedIssuers()在 TLS 证书请求消息中返回空 CA 列表。据我所知,在 C#/.Net 中,SslStream's RemoteCertificateValidationCallback没有它的等价物。据我所知,此列表是使用 IIS/ 时机器的受信任证书列表构建的SslStream。 (请注意,这与证书验证本身无关,它只是关于服务器通告它可能接受哪些证书。)

此外,如果您想使用带有自签名证书的客户端证书身份验证,则必须在服务器中实现您自己的验证回调来执行此身份验证。一个简单的示例是从您获得的证书中提取公钥,将其与服务器具有的预定义列表进行比较,然后使用该预定义列表中的用户名。你不能相信自签名证书所说的任何内容,除非你有一种明确的方法来根据你所知道的内容检查其内容。实现一个回调,只说return true;不会执行任何身份验证。任何人都可以构建具有相同名称或属性和不同密钥的证书。 (最好在服务器可信证书存储中明确信任每个客户端证书,尽管这可能会导致 TLS 证书请求消息中出现很长的 CA 列表。)

如果您不想依赖商业 CA,请构建您自己的 CA。这可能需要一些工作(主要是管理工作),但至少您将拥有一个更干净的结果系统。通过使用该 CA 证书配置客户端和服务器,您应该能够扩展到更多客户端和服务器,而无需进行任何更改,并且在请求客户端证书时,您还可以从正常的 CA 列表行为中受益。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSL/TLS 中的相互身份验证 的相关文章

  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 当存在打开的 ASP.NET 4.5 Websocket 时,IIS 应用程序池无法回收

    我遇到了一个问题 可以通过以下方式复制 您需要 IIS8 因此必须在 Windows 8 或 Windows Server 2012 R2 上 在 IIS 管理器中创建一个新网站 例如在端口 8881 上的 TestWs 指向一个新文件夹
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 如何为 CSS 垂直下拉菜单添加延迟

    我需要为下拉菜单的鼠标悬停事件添加延迟 这样如果有人将鼠标悬停在菜单上并转到页面上的另一个链接 菜单不会立即下拉 感谢您的帮助 http jsfiddle net cgagliardi NPVVQ http jsfiddle net cga
  • saltstack jinja 中的“json”和“tojson”过滤器有什么区别吗?

    根据 saltstack 文档 它是 json https docs saltstack com en latest ref renderers all salt renderers jinja html https docs saltst
  • 在字典中循环

    我用这个 foreach KeyValuePair
  • 过滤查询以填充 FirebaseRecyclerAdapter

    目前尚不清楚如何使用自定义查询填充 FirebaseRecyclerAdapter 定义一个参考 这里 DatabaseReference ref mDatabase getReference child users 将其发送到适配器 in
  • 保护HTML5游戏来源

    人们对 HTML5 赞不绝口 但我主要关心的问题之一是如何保护我的游戏源代码 本质上 如何防止别人使用我们自己开发的游戏引擎 那是一笔巨大的资产 如何防止他人下载游戏并将其托管在其他平台 如何隐藏源中的服务器 API 调用详细信息 例如我们
  • Ruby 相当于 PHP 的 ucfirst() 函数

    在 Ruby 使用 Rails 如果相关的话 中将字符串的第一个字母大写的最佳方法是什么 注意String capitalize不是我想要的 因为除了将字符串的第一个字母大写之外 此函数还使所有其他字符小写 我不想要 我想保持它们不变 gt
  • 如何在 bash 脚本中获取文件的第一行?

    我必须在文件的第一行放入 bash 变量 我猜是用grep命令 但是有什么方法可以限制行数吗 head从文件中获取第一行 然后 n参数可用于指定应提取多少行 line head n 1 filename
  • 尝试使用 conda 时出现“语法错误:生成器表达式必须带括号”

    每当我尝试访问任何 anaconda 命令时 我都会遇到这个问题 事实上 当我尝试打开我的虚拟环境时 它也显示在那里 我已经重新安装了 anaconda navigator 但仍然没有结果 C Users Gagan Singh gt ac
  • 如何通过 holoviz 和 NetworkX 渲染 GraphViz Dot 文件?

    所以我看着docs https hvplot holoviz org user guide NetworkX html并看到他们使用 Graphviz 但不使用任何文件 而且我有一个4mil dot 70mb 图形文件 https gith
  • 在 Ubuntu 上找不到 RODBC 包中的 odbcConnectExcel 函数

    在 Ubuntu 上安装 RODBC 包有点麻烦 首先我学会了安装以下内容 sudo apt get install r cran rodbc 这还不够好 因为包仍在寻找头文件 我通过以下方式解决了这个问题 sudo apt get ins
  • 导出或保存 CX509PrivateKey

    是否可以以某种方式保存或导出CX509PrivateKey 我的想法是 我创建一个 CSR 发送给 CA 获取证书 然后 不知何故我必须获取私钥 但不知道如何获取 不幸的是在谷歌上没有找到任何内容 我的一段代码 var objPrivate
  • SQL INSERT 不指定列。会发生什么?

    在浏览心爱的 W3schools 时发现了这个page http www w3schools com sql sql insert asp并且实际上学到了一些有趣的东西 我不知道您可以调用插入命令而不指定值的列 例如 INSERT INTO
  • 使用jquery删除字符串中的span标签

    如何使用jquery从字符串中删除span标签 我在字符串变量中有多个跨度标签 p No Change span style color 222222 nbsp span I love cricket span style color 22
  • 满足条件后避免使用 IF 语句

    我在一个重复多次的循环内进行除法运算 碰巧的是 在循环的前几次 或多或少的前 10 个循环 中 除数为零 一旦它获得价值 除零误差就不再可能 我有一个if测试除数值的条件以避免 div 为零 但我想知道评估此值会对性能产生影响if在后续循环
  • Android 开发人员通常在 iPhone 上使用第三方 UI/网络库(例如 Three20)吗?

    我做过很多 iPhone 方面的工作 但从来没有做过 Android 方面的工作 在 iPhone 上 几个月后我发现了 Three20 库 非常棒 并开始移动我的代码 我不想在转向 Android 时犯同样的错误 所以我的问题是 Andr
  • Scala 2.10 TypeTag 用法

    我正在挖掘新的 scala 反射 api 但无法弄清楚为什么以下代码片段不能按预期工作 给定层次结构 尽力简化 import scala reflect runtime universe trait TF A implicit def t
  • 任务并行性 - 任务 OnCompleted 在所有ContinueWith之后触发

    我在处理任务时遇到问题 GetAwaiter OnCompleted new Action 我有一个带有多个ContinueWith的主任务 但是当我返回主任务并在OnCompleted上添加委托时 它会在处理主任务后触发 而不是在所有Co
  • 每个循环使用 Rspec 的单元测试用例

    我的模型中有以下方法 def get performance data para child para hash performance graph data child para hash each do cp performance g
  • onclick 事件传递
  • id 或值
  • 我想通过 li id or value in onclick事件 这是我的退出代码 li li value 1 li li value 2 li 这是 JavaScript 代码 function getPaging str loading
  • SSL/TLS 中的相互身份验证

    我是 SSL 身份验证的新手 我需要使用 SSL 在信任边界上对两个架构组件进行身份验证 我可以控制这两个组件 我想我需要两种方式的 SSL 身份验证 服务器和客户端都有证书 证书可以自签名吗 即由供应商签名 这不会首先使使用 SSL 无效