GS2 类型的SASL 2010.7 RFC5801翻译 - tRavAsty/SASL GitHub Wiki
这个文档描述了如何在SASL中使用通用安全服务应用程序接口机制(GSS-API)。通过定义一个新的SASL机制家族,叫做GS2。这个机制提供了一系列基于以前的GSSAPI机制的提高;它更加通用,在某些情况下用更少的消息来认证,并且支持管道绑定的协商使用(shenmegui)
##1 介绍 GSS-API是RFC2743提供的一个框架,这个框架可以提供认证和基于连接的协议的安全层的服务,同样使用了非常多的机制。这个文件描述了如何使用一个GSS-API机制就好像它是一个SASL机制一样。这种设施就叫做GS2
GS1桥没能得到广泛的使用除了"the kerberos version 5 GSS-API Mechanism",而且有一系列问题使得想要设计一个新的桥。
特别的,目前SASL团体看起来好像一致同意SASL的安全层非常复杂而且冗余因为SASL应用往往可以选择运行在TLS上。SASL的安全层的使用最好能和TLS管道进行管道绑定
GS2被设计得尽可能简单。特别的,GS2增加了一个小的头标(一些比特和客户端请求的SASL认证身份)到初始的GSS-API内容令牌和应用管道绑定的数据。GS2使用SASL机制协商来实施管道绑定协商。安全相关的GS2明文通过GSS-API的管道绑定使用来保护。除此之外,为了简化不会使用GSS-API框架的GS2机制的实施,我们压缩了初始安全内容令牌头通过RFC2743.Section 3.1方法
GS2并不保护GS2以外的任何明文,例如SASL机制协商明文,或者认证之后的应用消息。但是使用管道绑定到一个安全的管道上所有的SASL和应用明文会让所有明文被认证
##3 机制名称 有两个SASL机制名称给任何使用这套设施的GSS-API机制。一个表示服务器支持管道绑定,另一个表示不支持
SASL机制名称是当它被指定时的机制提供的。这个名字表明了服务器不支持管道绑定。加上一个后缀"-PLUS"之后的名字表明服务器支持管道绑定。
如果GSS_Inquire_SASLname_for_mech接口没有被使用的话,GS2需要用其他的方法来内部联系机制对象标识符和SASL名称。如果这个常识失败了,那么GS2不能被使用
###3.1 从GSS-API 对象标识符产生SASL机制名称
SASL机制名称是一个字符串“GS2-”和字符串通过ASN.1 DER加密的二进制哈希值的前55位的Base32加密,包括GSS-API Oid的tag和长度字节。Base32字母表外的字母和本次使用的Base32方法不相关。 如果任何填充或者非法字符出现了,那么这个名字就不是GS2家族中的机制名字。后缀“-PLUS”表示服务器支持管道绑定
###3.2 手动计算机制名称
哈希衍生的GS2 SASL机制名称可以被手动计算。这在知道会使用的机制表示会很有用。它消灭了实行Base-32,SHA-1和DER在SASL机制中的要求,而且如果它是机制家族中的一员的话那么它的实施不需要担心
###3.3 例子
简单公钥GSS-API机制(SPKM-1)的OID是1.3.6.1.5.5.1,这个OID的ASN.1 DER加密的十六进制是06 07 2b 06 01 05 05 01 01.这个ANS.1 DER加密的SHA-1哈希值是1c f8 f4 2b 5a 9f 80 fa e9 f8 31 22 6d 5d 9d 56 27 86 61 ad。吧前7个字节转化成二进制,丢弃最后一位,通过5位一组来分组,再把他们转成10进制,会有如下计算
前7个字节的16进制:
1c f8 f4 2b 5a 9f 80
前7个字节的二进制:
00011100 11111000 11110100 00101011 01011010
10011111 1000000
5个一组的二进制:
00011 10011 11100 01111 01000 01010 11010 11010
10011 11110 00000
每一组的十进制表示:
3 19 28 15 8 10 26 26 19 30 0
base32 加密:
D T 4 P I K 2 2 T 6 A
最后一步的翻译使用了Base32的表3
Table 3: The Base 32 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 9 J 18 S 27 3
1 B 10 K 19 T 28 4
2 C 11 L 20 U 29 5
3 D 12 M 21 V 30 6
4 E 13 N 22 W 31 7
5 F 14 O 23 X
6 G 15 P 24 Y (pad) =
7 H 16 Q 25 Z
8 I 17 R 26 2
因此,SPKM-1 GSSAPI的SASL机制名称就叫作"GS2-DT4PIK22T6A" 同理Kerberos V5 GSS-API mechanism的SASL机制名称叫做"GS2-QLJHGJLWNPL",又因为她支持管道绑定,所以它的名称叫做"GS2-QLJHGJLWNPL-PLUS"
###3.4 爷爷机制名称(我想静静)
有一些古老的GSS-API机制并没有制定的SASL GS2名称。使用一个短名字可以有效。我们指定"GS2-KRB5" 和"GS2-KRB5-PLUS"给Kerberos V5机制的名称
##4 SASL认证交换消息格式
在GS2的SASL认证交换中,一大堆遵守下列格式的消息会在客户端和服务器之间发送。 一旦成功,这个数字就是GSS-API通常会要求来建立安全内容的内容令牌的数字;一旦是被,这个交换就会被任意一方提前终止
当使用GS2机制时SASL客户端总是一个GSS-API初始者而SASL服务器也总是一个GSS-API的接受者。客户端叫做GSS_Init_sec_context,服务器端叫做GSS_Accept_sec_context
所有的SASL认证消息交换和GSS-API机制中的安全内容令牌一样,除了初始安全内容令牌
客户端和服务器也许会发送GSS-API错误令牌。这个指示了一个错误的状态,在发送这个令牌之后,发送端会认证失败
初始安全内容令牌按照如下的方法修饰:
初始内容令牌头必须被移除。如果投标不存在,那么客户端必须发送一个“"gs2-nonstd-flag”标志。在服务器端,这个投标需要被重新计算并且在 GSS_Accept_sec_context令牌前储存,除非接受到gs2-nonstd-flag
一个GS2头标必须是结果初始内容令牌的前缀
以下数据描述了允许的属性,他们的用法,以及他们值得格式。所有的属性名称都是单个US-ASCII字符并且大小写敏感
UTF8-1-safe = %x01-2B / %x2D-3C / %x3E-7F
;; As UTF8-1 in RFC 3629 except
;; NUL, "=", and ",".
UTF8-2 = <as defined in RFC 3629 (STD 63)>
UTF8-3 = <as defined in RFC 3629 (STD 63)>
UTF8-4 = <as defined in RFC 3629 (STD 63)>
UTF8-char-safe = UTF8-1-safe / UTF8-2 / UTF8-3 / UTF8-4
saslname = 1*(UTF8-char-safe / "=2C" / "=3D")
gs2-authzid = "a=" saslname
;; GS2 has to transport an authzid since
;; the GSS-API has no equivalent
gs2-nonstd-flag = "F"
;; "F" means the mechanism is not a
;; standard GSS-API mechanism in that the
;; RFC 2743, Section 3.1 header was missing
cb-name = 1*(ALPHA / DIGIT / "." / "-")
;; See RFC 5056, Section 7.
gs2-cb-flag = ("p=" cb-name) / "n" / "y"
;; GS2 channel binding (CB) flag
;; "p" -> client supports and used CB
;; "n" -> client does not support CB
;; "y" -> client supports CB, thinks the server
;; does not
gs2-header = [gs2-nonstd-flag ","] gs2-cb-flag "," [gs2-authzid] ","
;; The GS2 header is gs2-header.
当gs2-nonstd-flag旗帜出现的时候,客户端不会从初始的GSS_Init_sec_context返回的令牌寻找/移除一个令牌头。这告诉服务器说它不能重新增加已经被客户端正常移除的数据
gs2-cb-flag显示在管道绑定模式。"p", "n" 和 "y"中的一个会被使用。"p"意味着客户端支持并且使用了管道绑定,而且管道绑定类型的名字已经被指示了;"n"意味着客户端不支持管道绑定;"y"意味着客户端支持管道绑定,但是认为服务器不支持,所以它没使用管道绑定。接下来的章节会详细的说明
"gs2-authzid"保留SASL认证身份。它通过UTF-8字符,除了以下三种:
NUL禁止使用
服务器必须把所有的","替换成字符串"=2C"
服务器必须把所有的"="替换成字符串"=3D"
在这个值得收据中,服务器会由使用过的SASL协议文件验证它的正确性。失败的认证导致失败的认证交换
##5 管道绑定
GS2 支持管道绑定到外部的安全管道中,比如说TLS。客户端和服务器也许支持或者不支持管道绑定;因此,管道绑定的使用是可协商的。然而,GS2不提供安全层;因此,GS2必须提供管道协商的完整性安全保护
管道绑定的协商如下:
支持管道绑定的服务器应该告知non-PLUS名称和PLUS变量名称。如果服务器不能支持管道绑定,它应该只告知
non-PLUS变量。如果服务器因为政策原因从来没有在non-PLUS变量下成功过,那么它就只能告知PLUS变量
如果客户端支持管道绑定但是服务器好像不支持,那么客户端不能在"gs2-cb-flag"中使用"n"
支持机制协商和管道绑定的客户端在服务器提供PLUS变量的时候必须在"gs2-cb-flag"中使用"p"
如果客户端不支持管道绑定,那么它必须在"gs2-authzid"中使用"n",反过来,如果客户端要求使用管道绑定的话那么它必须在"gs2-authzid"中使用"p"。不支持机制协商的客户端不能在"gs2-authzid"中使用"y"
客户端产生chan_bindings输入参数给GSS_Init_sec_context
如果服务器提供了管道绑定服务但是得到"gs2-authzid"的回复"y",那么服务器必须终端这次认证协商。如果服务器得到"p",但是不支持管道绑定,服务器也同样得终止这次协商
###5.1 GSS-CHANNEL-BINDINGS结构的内容
GSS_Init_sec_context和GSS_Accept_sec_context的调用需要使用一个chan_bindings parameter参数。
GSS-CHANNEL-BINDINGS结构中的initiator-address-type域和acceptor-address-type域必须为0。The initiator-address和acceptor-address域必须为空字符串
application-data field域必须设置gs2-头标,
###5.2 默认的管道绑定
给所有不提供自己的管道绑定类型的SASL应用协议的默认协议描述如下
'tls-unique'是没有特别标明管道绑定的应用的默认绑定
服务器支持管道绑定的话,就必须支持"tls-unique"管道绑地,客户端也同理。客户端和服务器应该选择最高级的端到端的TLS管道作为被绑定的管道
##6 例子
GSS-API认证总是由客户端发起的,而SASL允许任意一端发起