Techioz Blog

opalrb で openssl を取得するにはどうすればよいですか?

概要

以前、このコードを Ruby から opalrb JavaScript にコンパイルしようとしました

require 'openssl'


cert = """-----BEGIN CERTIFICATE-----
MIIF0jCCBLqgAwIBAgIQE6uZ3+oqXXc/+5sp3TQd3zANBgkqhkiG9w0BAQsFADB1
MUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBD
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTELMAkGA1UECwwCRzMxEzARBgNVBAoMCkFw
cGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTIyMTIzMDE1MzIxOVoXDTI1MTIyOTE1
MzIxOFowga0xGjAYBgoJkiaJk/IsZAEBDApMSDI4WEE3VDIyMUAwPgYDVQQDDDdp
UGhvbmUgRGlzdHJpYnV0aW9uOiBTdW5zaGluZSBJbnN1cmFuY2UgR3JvdXAgQ28u
LCBMdGQuMRMwEQYDVQQLDApMSDI4WEE3VDIyMSswKQYDVQQKDCJTdW5zaGluZSBJ
bnN1cmFuY2UgR3JvdXAgQ28uLCBMdGQuMQswCQYDVQQGEwJDTjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKorSaxSoBNGkikg3M2brfrD4dpWga8oIVIv
L7oKGpvjjYCY2S6tuNIEZA0cdpTIcQ84j31RAoU6Y6xgyCpvb5c7I28hFVlM4ssR
fXQ0O/as8aF+TZvQMnDreLOndS6lKpeCitWDKt3cJS0bxjCUxY8A0e0sCNncQJht
UEcdNaFEVbrsIVD0zuS6ii+UEIBpv8EKdcUKsygFCM/Cc5MJ4QF9Ke+U3VHbgJ1Z
IhbUpTakj8ZgMD+Djvqkt4WDXU2Qc3aROg3VWNTTTV230efImd/jH6bWGMKv8XtG
gPwoTzPqFB50LRDg3ghsqH6esTcEWf2olDMJBerBo1NZ1Ec6i3kCAwEAAaOCAiMw
ggIfMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUCf7AFZD5r2QKkhK5JihjDJfs
p7IwcAYIKwYBBQUHAQEEZDBiMC0GCCsGAQUFBzAChiFodHRwOi8vY2VydHMuYXBw
bGUuY29tL3d3ZHJnMy5kZXIwMQYIKwYBBQUHMAGGJWh0dHA6Ly9vY3NwLmFwcGxl
LmNvbS9vY3NwMDMtd3dkcmczMDEwggEeBgNVHSAEggEVMIIBETCCAQ0GCSqGSIb3
Y2QFATCB/zCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRp
ZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRo
ZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1
c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGlj
ZSBzdGF0ZW1lbnRzLjA3BggrBgEFBQcCARYraHR0cHM6Ly93d3cuYXBwbGUuY29t
L2NlcnRpZmljYXRlYXV0aG9yaXR5LzAWBgNVHSUBAf8EDDAKBggrBgEFBQcDAzAd
BgNVHQ4EFgQUofgyj62dk2i3I5Xb1b9h7etBc4EwDgYDVR0PAQH/BAQDAgeAMBMG
CiqGSIb3Y2QGAQQBAf8EAgUAMA0GCSqGSIb3DQEBCwUAA4IBAQCXbTgmDM+uppd9
FBdvc6F0pZV03kInxZr1EsiUizpcEYTIghkbw2JIZZ8DvOCdM/Fv4ypJ2SOu2BNr
xlWBG2JP6Yn8345V3PcfxABMWQUnj9x7EG68sNomJ4URlWD0cgKqz0IU7DsoW+ak
SIYeh2s5/GNzOMAYuUGEJB/ai/MXCNY24EhwYisKPUR8YKKjb+Wm02DTRkaYVZI8
kUUTu4lKLTlTB39OYkp+7B/x/QUkopgeRRL4wX5PcI42dolUq2LwcuJXYyN0k9Og
Wo6ByfM+3ae0UX8YMIhXphEe4QxEzmoROoys9QYm6YMg52XnjcAPEBZ1USeG/e4e
aboYVMIu
-----END CERTIFICATE-----"""

x509 = OpenSSL::X509::Certificate.new(cert)



puts x509.subject.to_s

エラー {OpenSSL: 初期化されていない定数 OpenSSL が定義されていません}

Ruby の openssl を JavaScript opalrb にコンパイルすることは可能ですか?

はいの場合、どうすればよいですか?

解決策

簡単に言うと「ノー」です。 JRuby と同様、Opal は Ruby の C API をサポートしていません。したがって、一般に、Ruby の OpenSSL 拡張機能を Opal 用にコンパイルすることはできません。

ただし、環境によっては OpenSSL が利用できる場合があります。特に、Node.js は次のモジュールをサポートしています: https://nodejs.org/api/tls.html 。 Opal のそのモジュールへのバインディングについては知りません。そのため、独自のモジュールを作成する必要があります。 Opal では、バックティック演算子を使用して JavaScript コードを補間できます。あるいは、ネイティブの Opal stdlib ライブラリを使用することもできます。

ブラウザ (またはその他の) 環境の場合、OpenSSL を WASM にコンパイルし、Opal を使用してそれとインターフェースできる場合があります。しかし、その道を進みたいのであれば、おそらく Ruby WASM がより良い選択であることが判明するかもしれません。