Skip to content

网关报文加解密、加验签

网关中提供了请求报文解密、请求报文验签、响应报文加密和响应报文加签过滤器,保证了报文在网络传输层的安全性。

请求报文解密过滤器是comet-geteway工程中的DecodeGatewayFilterFactory 类,响应报文加密过滤器是comet-geteway工程中的EncodeGatewayFilterFactory 类,请求报文验签过滤器是comet-geteway工程的RsaCheckGatewayFilterFactory ,响应报文加签过滤器是comet-geteway工程的RsaSignGatewayFilterFactory类。

1.1.请求报文解密

1.1.1.使用方法

在网关拓扑图中给某个要配置报文解密的服务添加请求报文解密过滤器,过滤器上配置解密要使用的秘钥aesKey ,此参数的值是任意16位字符。

1.1.2.功能测试

首先在网关添加完请求报文解密过滤器,通过上述提到的响应报文加密过滤器中加密算法将要访问的服务接口的参数进行加密,然后使用postman或jmeter从网关调用要访问的接口传入加密报文,看响应结果是否正常即可。

1.2.响应报文加密

1.2.1.使用方法

在网关拓扑图中给某个要配置响应报文加密的服务添加请求响应报文加密过滤器,过滤器上配置加密要使用的秘钥aesKey ,此参数的值是任意16位字符。

1.2.2.功能测试

在网关拓扑图中,给要测试的服务添加响应报文修改过滤器之后,直接使用postman或jmeter从网关中访问要测试的接口,观察此时接口的响应报文体是否是密文即可。

1.3.请求报文验签

请求报文验签过滤器要配合解密报文过滤器使用,先配置请求报文解密过滤器,然后再配置请求报文验签过滤器。网关上这么使用的原因是:报文在网关的exchange上读出来的可能与实际发送过来的请求体中的数据字段顺序可能会不一致,先加密传输到解密过滤器中然后将解密之后的报文转成字符串放入exchange对象的属性中,此时就保证了在验签时候的报文的先后顺序是一致的。传送到验签过滤器获取的这个属性的值与加签的一致,能更有效的验证报文是否被篡改。

1.3.1.使用方法

在服务的过滤器上先添加请求报文解密过滤器,在配置请求验签过滤器,这两个过滤器的添加顺序必须是解密过滤器在验签过滤器之前,否则验签会报错,配置验签的时候必须先添加解密过滤器。

1.3.2.功能测试

加密的报文生成方式不变,参考上述的解密报文过滤器的功能测试生成加密报文,报文验签需要在请求的header中添加md5 参数,md5的参数生成方式为:将请求原报文+“|”+salt字符串用MD5加密之后,使用私钥给加密之后的字符串加签。其中salt对应的是请求报文过滤器上配置的salt的值,请求的公钥和私钥配置在 comet-gateway工程的key.json文件中。

json
#key.json
[
{
"sourceName": "cif",
"gatewayPrivate": "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJFMx6vVJjDqv/gRRAh6L6v9mXTIDCowOjLkamEpLtMkOyK1Wxq1S38DjE3U8LKUXdypoj7oyYmpTQsSQIBsW0PWfz7nfvC3lb4hd3RM/qMYxaQlsu+Sx8G0T43W0qJtzOW0sdw4lpZUNMWOTmfUeWKnAWCbvc1lOsKGNI0dWxEbAgMBAAECgYBzJCL+mjRfg0eI7zW4egsZAif/ESACtqEH/1YFlLsUepuaD5kYex5OkqM2ck4jVctjt9FohNRgkJcK9PXETxmqYLuzrtrnYQqEUfM6e/VD4YZiX4y7XBR+i9ifWeNyxnqgLplgZdAiQvRSrBSKLym+F/ErjPiQjnCyy0fF1Ln8oQJBAMJqT45vC7j5UwsvaPL70ZRH0XKq9Q7yxjBgUHYvByQiZIFX07tennMfQLiEYKdBeafa/JTseO5gri4EuxfsSNMCQQC/U5Ckjo64vj8ddfQ6KK0vOPsAfDo8xXtIMfKMNeBZG4+E6iRpsiLyRlI1eK7Qmz/ulMfdWgDCXPJ65XiAh2mZAkByVa8/5tKQECDkfRdNfwb8G1h0BVJlXiVsIdhwCKw8dfWBk7MziCvLLGAVo9RryLfRHZpZwtBD8Ju++I1HPnB9AkAhsUCWifg+Nlp9AKmamFEvMLSa+EV1MD2ukAUrhc1VQ9I5UNZKurEGwzV07ySx3bUbeZ3csB3UHHQjCkf3MmF5AkEAhtvm0SPIGaoL+etcVqKnu0N3J0DFBShsnKiceGmiFeCLT+fGP8av2F+OZV5UnSBQG1BzwlvVG0+sOc9zrdR2+w==",
"appPublic": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRTMer1SYw6r/4EUQIei+r/Zl0yAwqMDoy5GphKS7TJDsitVsatUt/A4xN1PCylF3cqaI+6MmJqU0LEkCAbFtD1n8+537wt5W+IXd0TP6jGMWkJbLvksfBtE+N1tKibczltLHcOJaWVDTFjk5n1HlipwFgm73NZTrChjSNHVsRGwIDAQAB"
}
]

其中sourceName的值对应请求验签过滤器中配置的sourceName属性,gatewayPrivate是加签要使用的私钥,appPublic是验签要使用的私钥,若要生成新的公钥和私钥参考类 RSAUtil.java中的genKeyPair方法。

验签代码示例:

java
//代表原始报文
String str = "abdcmlsmslsl";
//私钥		  
String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJFMx6vVJjDqv/gRRAh6L6v9mXTIDCowOjLkamEpLtMkOyK1Wxq1S38DjE3U8LKUXdypoj7oyYmpTQsSQIBsW0PWfz7nfvC3lb4hd3RM/qMYxaQlsu+Sx8G0T43W0qJtzOW0sdw4lpZUNMWOTmfUeWKnAWCbvc1lOsKGNI0dWxEbAgMBAAECgYBzJCL+mjRfg0eI7zW4egsZAif/ESACtqEH/1YFlLsUepuaD5kYex5OkqM2ck4jVctjt9FohNRgkJcK9PXETxmqYLuzrtrnYQqEUfM6e/VD4YZiX4y7XBR+i9ifWeNyxnqgLplgZdAiQvRSrBSKLym+F/ErjPiQjnCyy0fF1Ln8oQJBAMJqT45vC7j5UwsvaPL70ZRH0XKq9Q7yxjBgUHYvByQiZIFX07tennMfQLiEYKdBeafa/JTseO5gri4EuxfsSNMCQQC/U5Ckjo64vj8ddfQ6KK0vOPsAfDo8xXtIMfKMNeBZG4+E6iRpsiLyRlI1eK7Qmz/ulMfdWgDCXPJ65XiAh2mZAkByVa8/5tKQECDkfRdNfwb8G1h0BVJlXiVsIdhwCKw8dfWBk7MziCvLLGAVo9RryLfRHZpZwtBD8Ju++I1HPnB9AkAhsUCWifg+Nlp9AKmamFEvMLSa+EV1MD2ukAUrhc1VQ9I5UNZKurEGwzV07ySx3bUbeZ3csB3UHHQjCkf3MmF5AkEAhtvm0SPIGaoL+etcVqKnu0N3J0DFBShsnKiceGmiFeCLT+fGP8av2F+OZV5UnSBQG1BzwlvVG0+sOc9zrdR2+w==";
//公钥		  
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRTMer1SYw6r/4EUQIei+r/Zl0yAwqMDoy5GphKS7TJDsitVsatUt/A4xN1PCylF3cqaI+6MmJqU0LEkCAbFtD1n8+537wt5W+IXd0TP6jGMWkJbLvksfBtE+N1tKibczltLHcOJaWVDTFjk5n1HlipwFgm73NZTrChjSNHVsRGwIDAQAB";
//报文拼接salt之后转成MD5(摘要)
String digest = AesUtils.sign(str, "dcits");//这里的dcits代表验签过滤器中配置的salt
//使用私钥加签
String sign = RSAUtil.sign(testStr1, privateKey);//请求头中要传入的md5
//验签
System.out.

println("docheck:"+doCheck(digest, sign, publicKey));

网关中验签流程:

首先必须要配置加密报文,然后配置请求解密过滤器将报文解密exchange对象的CACHE_REQUEST_BODY_OBJECT_KEY 属性中,然后验签过滤器也是从此属性上获取的原始报文进行验签。

解密并放置原始报文代码:

获取原始报文并验签代码:

1.4.响应报文加签

1.4.1.使用方法

响应报文加签需要先配置响应加签过滤器在配置响应报文加密过滤器,两个过滤器执行的时候响应加签过滤器主要是将加签需要的参数获取到放入exchange中,然后在执行响应报文加密过滤器的时候将报文加密返回,并且获取加签要用的参数给未加密的响应原始报文加签,将加签之后的信息放到response的header中返回。

响应加签过滤器代码(获取加签配置):

响应报文加密代码(给报文加密并加签):

1.4.2.功能测试

在要测试的服务上先添加响应报文加签过滤器,再添加响应报文加密过滤器。添加加签过滤器的配置时要注意在key.json 问价中是否有对应的sourceName的值以及公钥和私钥。

添加完成之后使用postman或jmeter发送接口请求查看响应报文是否是密文,响应头中是否带有响应的加签值md5。