openresty集成ssl验签功能

博客围绕CentOS测试和构建SSL验签镜像展开。在CentOS测试中,介绍使用阿里云yum repo、更新yum组件、安装所需组件、生成证书及验证签名等操作。构建SSL验签镜像时,涉及基础镜像制作、启动容器、安装依赖、打开nginx日志开关、修改配置文件及创建lua脚本等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

centos测试

使用阿里云的yum repo

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d.bak/CentOS-Base.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum repolist

需要更新yum组件,否则安装openssl-devel提示冲突

yum update 

安装所需yum组件

#luaossl的依赖项
yum install epel-release
yum install openssl-devel
#lua包管理器
yum install luarocks
yum install lua-devel

安装所需lua组件

#ssl组件
luarocks install luaossl
#base64组件,openresty镜像中不用执行该命令,如执行会提示Error: No results matching query were found.
luarocks install mime

生成证书命令

openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout -out public.pem
openssl rsa -in private.key -outform der -out private.der

验证签名lua脚本

local pkey = require("openssl.pkey")
local digest = require("openssl.digest")
local mime = require("mime")

-- 读取pem格式公钥证书文件
local pk_cert_data = assert(io.open("/root/public.pem", "rb")):read("*a")

local pkey =pkey.new()

pkey:setPubinsiglicKey(pk_cert_data)

-- 原始数据
local data = "Hello, World!"

-- 创建SHA256摘要对象
local digest_data = digest.new("sha256")
print(digest_data)
-- 更新摘要
digest_data:update(data)
--使用java项目中签名方法生成的签名
local signatures ="fwOupXYu/6bl8RqMJWztrU6trsKkGXSh2nyQyHHmiuqlyCXWm5sE3zCzqoYVB5ppYIwzYGWYmhEH9jRzmB6R7oZXDLKnom/BaRnUMmrHjmgaI5AL9jAAyLKckNlOl1ptS35a7A3PyFDTBkOxq6gEZjJhMHxJVe4W98JJMpZqzZ5nM5nOVDKRsUrziSO0M7u/nDt03IoxB8wN34ljkjhXbT8v6my85QYTH3e0Pj9dcBiUV9Sv04GOCEr+eE9HznWirb169+MsulGERi2ILZAf+kTWJ/I5TYrGvbviowhtvRU4j1zJvnVRE1rjOEZpvxmBUAoSXpWOSUcqlVKAwsLbaQ=="
local signature =mime.unb64(signatures)
-- 打印签名
print("Signature:", signature)

-- 验证签名
local verify_result = pkey:verify(signature, digest_data)

-- 判断验签结果
if verify_result == true then
  print("Signature is valid.")
elseif verify_result == false then
  print("Signature is invalid.")
else
  print("Verification failed.")
end

输出

userdata: 0x21973e8
Signature:      ��v.�����%l��N��¤t��|��q���%֛��0����i`�3`e���4s���W
                                                                  ���o�i�2jǎh#�
                                                                               �0
Signature is valid.

生成签名的方法(AuthUtil)

    public static void main(String[] args) {
        String json2String = "Hello, World!";
        String sign = RsaUtil.standardSign(RsaUtil.getPrivateKeyFromDer("/opt/private.der"), json2String);
        System.out.println(sign);
        PublicKey publicKey = RsaUtil.getPublicKeyFromPem("/opt/public.pem");
        AuthUtil authUtil = new AuthUtil();
        boolean b = authUtil.standardVerifyMsgByPemPubKey(sign, json2String, publicKey);
        System.out.println(b);

    }
    /**
 * 获取私钥
 *
 * @param filename 私钥路径
 * @return 私钥
 */
@SneakyThrows
public static PrivateKey getPrivateKeyFromDer(String filename) {
    Security.addProvider(new BouncyCastleProvider());

    byte[] keyBytes = Files.readAllBytes(Paths.get(filename));
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory kf = KeyFactory.getInstance(KEY_ALGORITHM);
    return kf.generatePrivate(spec);
}
 /**
 * 生成签名
 */
public static String standardSign(PrivateKey priKey, String tobeSigned) {
    try {
        Signature sign = Signature.getInstance(SIGNATURE_ALGORITHM);
        sign.initSign(priKey);
        sign.update(tobeSigned.getBytes(StandardCharsets.UTF_8));
        byte[] si
### OpenResty 功能的实现方法 在 OpenResty 中实现功能通常涉及以下几个方面: 1. **接收请求并解析参数** 使用 Lua 脚本处理 HTTP 请求,提取名字段和其他业务数据。 2. **名的有效性** 根据约定好的算法(如 HMAC-SHA256 或 RSA),重新计算名并与接收到的名对比。 以下是基于 HMAC-SHA256 的具体实现方式及其代码示例[^2]。 #### 代码示例:HMAC-SHA256 ```lua local cjson = require "cjson" local ngx_md5 = ngx.md5 local hmac = require "resty.hmac" -- 假设密钥为 secret_key local SECRET_KEY = "your_secret_key_here" -- 获取请求体中的 JSON 数据 local function get_request_body() ngx.req.read_body() local body_data = ngx.req.get_body_data() if not body_data then ngx.log(ngx.ERR, "Failed to read request body") return nil end return cjson.decode(body_data) end -- 计算名 local function calculate_signature(data, key) local hmac_obj = hmac:new(key, hmac.ALGOS.SHA256) local signature = hmac_obj:final(cjson.encode(data)) return ngx.encode_base64(signature) end -- 名 local function verify_signature(request_data, received_signature) local calculated_signature = calculate_signature(request_data, SECRET_KEY) return calculated_signature == received_signature end -- 主逻辑 local function main() local data = get_request_body() if not data then ngx.status = ngx.HTTP_BAD_REQUEST ngx.say("Invalid request body") return end -- 提取名字段 local received_signature = data.signature if not received_signature then ngx.status = ngx.HTTP_BAD_REQUEST ngx.say("Missing signature field") return end -- 移除名字段以便参与名计算 data.signature = nil -- if verify_signature(data, received_signature) then ngx.say("Signature verified successfully!") else ngx.status = ngx.HTTP_UNAUTHORIZED ngx.say("Invalid signature") end end main() ``` 上述代码实现了以下功能: - 解析请求体中的 JSON 数据。 - 将名字段移除后重新计算名。 - 对比计算得到的名与客户端传递的名是否一致。 如果需要使用更复杂的加密机制(如 RSA),则可以通过 OpenSSL 库来完成公私钥加解密操作。 --- ### 注意事项 1. **安全性考虑** 确保密钥存储安全,避免泄露。建议通过环境变量或其他配置管理工具加载密钥。 2. **性能优化** 如果流量较大,可以引入缓存机制减少重复计算开销。 3. **错误处理** 完善异常捕获逻辑,防止因非法输入导致服务崩溃。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值