游客发表
你打开浏览器,想快速生成一对RSA密钥,使用或者把一段Base64扔进解码器——结果搜出来的使用全是“在线工具”页面,背后偷偷把你的使用私钥上传到某个不知道谁的服务器。这事我干过,使用后来再也不敢了。使用其实有个更干净的使用办法:在浏览器里跑一个完整的OpenSSL环境,所有运算都在本地完成,使用数据不出你的使用机器。
怎么做到的使用?有个项目叫 WebAssembly OpenSSL,把OpenSSL编译成了WASM模块。使用你访问特定页面,使用浏览器加载这个模块,使用然后你就能像在终端里一样敲openssl命令。使用我第一次用的使用时候半信半疑,试了openssl rand -hex 16,回车,真出来一串随机十六进制。又试了openssl dgst -sha256对一段文字做哈希,结果和本地终端完全一致。
具体入口有几个。一个是 https://openssl-wasm.example.com(示例地址,实际可搜“OpenSSL WASM online”),界面就是一个黑色终端模拟器。另一个是某些CTF练习平台内置的,比如 https://ctf.example.org/openssl。我常用的是第一个,因为它支持文件上传——当然文件不会真上传,只是被读进WASM的内存文件系统里。
.pem文件,我直接拖进浏览器里那个WASM OpenSSL页面,敲了openssl x509 -in cert.pem -text -noout,立刻看到颁发者和有效期。整个过程没装任何软件,也没把证书内容发给任何第三方。 不过得说清楚,不是所有OpenSSL命令都能跑。WASM环境缺少一些系统调用,比如openssl s_client连接远程服务器就不行——它没法建立真正的TCP连接。但密钥生成、证书解析、加解密、哈希、Base64编解码这些纯计算任务,完全没问题。我试过生成2048位RSA密钥,大概等了两三秒,比本地终端慢一点,但能接受。
# 在WASM OpenSSL里生成私钥 openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048 # 从私钥提取公钥 openssl rsa -in private.pem -pubout -out public.pem # 查看私钥内容 openssl pkey -in private.pem -text -noout 上面这几条我反复跑过。注意genpkey比老的genrsa更通用,推荐用这个。生成完的文件在WASM的虚拟文件系统里,你可以点下载按钮保存到本地。下载下来的private.pem和本地openssl生成的格式一模一样,能直接导入其他工具。
还有一类“在线使用”是API形式的。比如你写个脚本,调用某个云函数的接口,传参{ "cmd": "openssl dgst -sha256", "data": "hello"},它返回结果。这种我坚决不用——你的数据经过别人的服务器,哪怕对方声称“不记录”。哈希还好,如果是私钥操作,等于把钥匙交给陌生人。
那WASM方案有没有缺点?有。第一,首次加载WASM模块大概2-5MB,网速慢的话要等几秒。第二,不能持久化——刷新页面,之前生成的文件就没了,得记得下载。第三,不支持硬件加速,生成4096位密钥可能要十几秒。但比起把私钥上传到某个“在线工具”,这些代价我完全愿意付。
我现在的习惯:临时要算个哈希、解个Base64、看个证书,直接开浏览器WASM版。要生成长期使用的密钥,还是回本地终端——毕竟本地有~/.ssh和openssl.cnf,配置更顺手。但出门在外用别人电脑,WASM版就是救急神器。上次在客户现场,他们内网没装OpenSSL,我打开浏览器三分钟搞定证书格式转换,对方还以为我带了什么秘密工具。
最后说个细节。WASM版OpenSSL的版本可能比本地旧,比如还是1.1.1系列。如果你需要3.0的新特性(比如openssl genpkey -algorithm ED25519),得找基于OpenSSL 3.x编译的WASM包。目前我找到的稳定版本是1.1.1w,够用。真要3.0,可以自己用Emscripten编译——但那又是另一个故事了。
友情链接