wasmer運行時

上一篇文章分享了基於wasm的openssl實踐,講述了openssl的MD5算法如何在瀏覽器中執行。在探索過程當中發現了openssl是能夠經過wasm編譯後直接run,而且有本身的runtime,這是由於openssl.wasm是經過wasmer編譯運行的,這一篇文章分享製做具備運行時的openssl.wasmpython

概述

  • Wasmer介紹
  • Openssl編譯到WASM
  • 總結

1、Wasmer介紹

Wasmer是一個用於在服務器上執行WebAssembly的開源運行時。支持基於WebAssembly的超輕量級容器,該容器能夠在任何地方運行,還能夠嵌入其餘編程語言。其生態包括如下幾個部分:linux

1. Wasmer Runtime

Wasmer Runtime是Wasmer生態其中一個,容許wasm模塊能夠獨立運行。關鍵功能是使程序可以以任何編程語言運行;使二進制文件可以在Wasmer支持的任何「操做系統」(例如Linux、macOS、Windows和FreeBSD)上不加修改地運行;充當Wasm模塊,經過應用程序二進制接口(ABI),如WASI(WebAssembly System Interface)和Emscripten(1.38.43及更早版本)與本機「操做系統」功能交互的安全橋樑。git

2. WAPM

WAPM是WebAssembly Package Manager的縮寫,爲能夠獨立使用的Wasmer Runtime作的軟件包管理器。能夠理解爲經過Wasmer軟件包編譯出來的.wasm文件是能夠獨立運行的,WAPM就是爲了管理這些能獨立運行的runtime而存在的。如圖:github

在這裏插入圖片描述
搜索一個openssl運行時的.wasm。web

在這裏插入圖片描述
提供了運行時環境。算法

在這裏插入圖片描述

整個看上去和docker hub有點像,還有製做方法,咱們能夠參考作一個新版的openssl.wasm.docker

在這裏插入圖片描述

3. WebAssembly.sh

WebAssembly shell程序是一個在線shell程序,您能夠在其中拖放WebAssembly模塊以進行嘗試,還能夠執行WAPM中可用的WASI模塊的全部命令。在線演示地址:https://webassembly.sh/shell

在這裏插入圖片描述

4. Wasienv

Wasienv是一個工具,旨在將全部編程語言引入WebAssembly WASI的工具能夠將不一樣的編程語言編譯到WebAssembly中,而後在瀏覽器或服務器中運行程序。編程

看上去和上一篇咱們使用的Emscripten很像,雖然二者都能把高級語言編譯成.wasm文件,可是後者更注重web方面的開發在瀏覽器中運行(也是第一個生成wasm的工具),前者是解決跨平臺的問題,體現的是wasm的可移植性。瀏覽器

這裏有個WebAssembly WASI的概念,WASI是WebAssembly System Interface的縮寫,是WebAssembly 平臺的系統接口, 由Wasmtime項目設計,目的是爲WASM設計一套引擎無關(engine-indepent), 面向非Web系統(non-Web system-oriented)的API標準。由於 WebAssembly 是概念機的彙編語言,因此 WebAssembly 須要一個概念操做系統的系統接口,而不是任何單一操做系統的系統接口。 這樣,它就能夠在全部不一樣操做系統中運行。

2、 Openssl編譯到WASM

1. 環境準備

2. 安裝wasienv

curl https://raw.githubusercontent.com/wasienv/wasienv/master/install.sh | sh

問題1

我本地沒法解析raw.githubusercontent.com

解決辦法

把install.sh複製到本地執行

問題2

執行過程當中 pip3 install wasienv --install-option="--install-scripts=$INSTALL_DIRECTORY/bin" --upgrade --user 報錯,不支持這種寫法

WARNING: Skipping wasienv as it is not installed.
/usr/local/lib/python3.7/site-packages/pip/_internal/commands/install.py:235: UserWarning: Disabling all use of wheels due to the use of --build-option / --global-option / --install-option.
  cmdoptions.check_install_build_global(options)
ERROR: Location-changing options found in --install-option: ['--install-scripts'] from command line. This is unsupported, use pip-level options like --user, --prefix, --root, and --target instead.

解決辦法

通過查閱資料,是由於pip3更新到最新版本致使,不支持--install-option=「」顯示傳參,回退版本

pip install --upgrade pip==19.3.1

問題3

執行過程 curl https://get.wasmer.io -sSfL | sh報錯,沒法解析域名

解決辦法

瀏覽器訪問,把內容複製出來,我保存的文件是install2.sh,修改install.sh中的引用。

問題4

執行過程  INSTALL_DIRECTORY/bin/wasienv install-sdk unstable

 File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 659, in urlopen
conn = self._get_conn(timeout=pool_timeout)
 File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 279, in _get_conn
return conn or self._new_conn()
 File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 948, in _new_conn
"Can't connect to HTTPS URL because the SSL module is not available."

解決辦法

分析

這是說python沒有ssl模塊,對於依賴的包,沒法下載的問題。
通過查閱資料,python ssl模塊對於openssl的版本有要求,因此這裏嘗試升級openssl

# 當前版本
~/Desktop/wasm$ openssl version
LibreSSL 2.8.3
# 安裝其餘版本openssl,第一步很慢
brew update && brew upgrade
brew uninstall --ignore-dependencies openssl; 
brew install https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb

參考文檔

https://www.jianshu.com/p/f8585da77ed9

https://stackoverflow.com/questions/45954528/pip-is-configured-with-locations-that-require-tls-ssl-however-the-ssl-module-in/59280089#59280089

https://stackoverflow.com/questions/35280956/ignoring-ensurepip-failure-pip-7-1-2-requires-ssl-tls-python-3-x-os-x#35282183

#設置brew源
https://www.jianshu.com/p/b26c7bc14440

問題4.1

安裝openssl 錯誤

Error: Calling Non-checksummed download of openssl formula file from an arbitrary URL is disabled! Use 'brew extract' or 'brew create' and 'brew tap-new' to create a formula file in a tap on GitHub instead.
If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):
https://github.com/tebelorg/Tump/issues/new

解決辦法

是openssl版本問題

執行

brew uninstall openssl
brew tap-new $USER/old-openssl
brew extract --version=1.0.2t openssl $USER/old-openssl
brew install openssl@1.0.2t

參考文檔:https://github.com/kelaberetiv/TagUI/issues/635

一頓操做以後,wasienv工具安裝完成。

3. openssl 生成 .wasm文件

我經過WAPM找到了openssl編譯的腳本,這是一個開源的例子。

git clone https://github.com/wapm-packages/OpenSSL.git

目錄結構

在這裏插入圖片描述

build.sh

#!/usr/bin/env sh

# Based on code from https://github.com/TrueBitFoundation/wasm-ports/blob/master/openssl.sh

OPENSSL_VERSION=1.1.1d
PREFIX=`pwd`

DIRECTORY="openssl-${OPENSSL_VERSION}"

if [ ! -d "$DIRECTORY" ]; then
  echo "Download source code"
  wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
  tar xf openssl-${OPENSSL_VERSION}.tar.gz
fi

cd openssl-${OPENSSL_VERSION}

echo "Configure"
make clean
wasiconfigure ./Configure linux-x32 -no-asm -static -no-sock -no-afalgeng -DOPENSSL_SYS_NETWARE -DSIG_DFL=0 -DSIG_IGN=0 -DHAVE_FORK=0 -DOPENSSL_NO_AFALGENG=1 -DOPENSSL_NO_SPEED=1 || exit $?

cp ../progs.h apps/progs.h

sed -i 's|^CROSS_COMPILE.*$|CROSS_COMPILE=|g' Makefile

echo "Build"
wasimake make -j12 build_generated libssl.a libcrypto.a apps/openssl

rm -rf ${PREFIX}/include
mkdir -p ${PREFIX}/include
cp -R include/openssl ${PREFIX}/include

cp -R apps/openssl.wasm ../

echo "Done"

思路以下:

  1. 從openssl官網上下載對應版本的包。
  2. 經過以前安裝的wasienv工具生成Makefile文件。
  3. cp progs.h文件到openssl/apps目錄下
  4. 編譯生成wasm文件,此時wasm文件在apps/openssl目錄下。
  5. 將openssl/include和.wasm文件複製到新的目錄下。

四、驗證openssl.wasm

~/Desktop/wasm/openssl_demo/OpenSSL$ wasmer run openssl.wasm
OpenSSL> help

Standard commands
asn1parse         ca                cms               crl
crl2pkcs7         dgst              dhparam           dsa
dsaparam          ec                ecparam           enc
engine            errstr            exit              gendsa
genpkey           genrsa            help              list
nseq              ocsp              passwd            pkcs12
pkcs7             pkcs8             pkey              pkeyparam
pkeyutl           prime             rand              rehash
req               rsa               rsautl            sess_id
smime             spkac             srp               ts
verify            version           x509

Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        gost              md4
md5               mdc2              rmd160            sha1
sha224            sha256            sha384            sha512
speed

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb
aes-256-cbc       aes-256-ecb       base64            bf
bf-cbc            bf-cfb            bf-ecb            bf-ofb
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb
des               des-cbc           des-cfb           des-ecb
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb
des-ofb           des3              desx              idea
idea-cbc          idea-cfb          idea-ecb          idea-ofb
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc
rc2-cfb           rc2-ecb           rc2-ofb           rc4
rc4-40            seed              seed-cbc          seed-cfb
seed-ecb          seed-ofb

看起來還不錯,基本的命令仍是有的,生成一個rsa私鑰試試。

#!/usr/bin/env sh
wasmer run openssl.wasm --dir=. -- genrsa -des3 -out priv.key 1024 || exit $?
~/Desktop/wasm/openssl_demo/OpenSSL$ cat priv.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,6D2827691E261E49

ADR7PRPukSBTEHiWvLxuj8DyU9QtiZIC0ZEQxJMRhx7n0b1J5wnrmIMfwbgtVLru
7vi/zdMqwIRJ7Afq3/g0r0/rWA55CF3SCX+UVSGnMrkOV68MWh2ETFCBD3NqmNG3
XZToct1bON0ES6OTEON+4V3PBunSpeU+6EKE8pTOLBeb6Frt1IQ1FgG8xVGfsCnk
DJKncHzN0D66mFlW0mrluiNvHk/PfBvzXQv2FlTdvctThOj/DK6yQ3m4PtPLYn1d
7qOy1wQt1OuXHnymgkR66Rf6OA2aAJXPxBp7C/aVxEAWWLKNw3zv/9rhlOqkIsEQ
i+tnf58VEBR6HGCDXA4UD83x1Pr9h0l5pcrHcvZYv+bnSiIhZGIVSCx0U9jmgbef
qg+L4wzIaaWaOTKpCtHm/10DWII5H6TO6uQHF8Bjz3bvR77tv/jaKRgrG+F7y4h9
5I+DsQjHhcQvIi2aro2o0DGsaD0qLK4jWbvFRxBb7FBfBEFQ9AWz04tZ9Oco5/Ti
ybMaZyLoCNGauqEQV3vS1OoR9IZ1Dzqra5X+YDRSGxTN+31dSCDYH5ta1VTHJyis
SMDfEisqz6vcIyEf+pWzF+yzhQj9aAqFEbWg+pG0Bhx4GXxhLy0WjnFVlWHxjTjN
hoZYC0vKc9uNvzaewFjHEn3IwnXTaXdknE25uBBc18ceBsaW7uzW7D4iPvjhtOC3
znrwo+VGuNPGJTb7md9Dz1q2fjTrPintPftN9ZqxAjeYx+7NiVZfm71mV88EAXYW
eQMQZmTFTiSyTcotDkyRPkvbDbXEytB4sVbwXiBasKxmrgzgz6UIjA==
-----END RSA PRIVATE KEY-----

3、總結

本篇文章主要介紹了WebAssembly的運行時,以及如何製做一個運行時的openssl.wasm。總體感受還不錯,如今咱們有了運行時的openssl.wasm,而且支持基本的命令,但不知道性能如何,下一篇文章分享openssl.wasm與原生openssl性能對比。

參考資料


Netwarps 由國內資深的雲計算和分佈式技術開發團隊組成,該團隊在金融、電力、通訊及互聯網行業有很是豐富的落地經驗。Netwarps 目前在深圳、北京均設立了研發中心,團隊規模30+,其中大部分爲具有十年以上開發經驗的技術人員,分別來自互聯網、金融、雲計算、區塊鏈以及科研機構等專業領域。Netwarps 專一於安全存儲技術產品的研發與應用,主要產品有去中心化文件系統(DFS)、去中心化計算平臺(DCP),致力於提供基於去中心化網絡技術實現的分佈式存儲和分佈式計算平臺,具備高可用、低功耗和低網絡的技術特色,適用於物聯網、工業互聯網等場景。公衆號:Netwarps

相關文章
相關標籤/搜索