07-19-2023, 01:08 AM
Where and when does `OpenSSL::OPENSSL_VERSION_NUMBER` get set? And why isn't it getting set to the latest OpenSSL that I've just installed?
First the error(s):
$ gem install activesupport -v '3.2.13'
Error while executing gem ... (RuntimeError)
Unsupported digest algorithm (SHA512)
If I go directly into irb, I can see that Ruby is using the "old" openssl:
$ irb
>> require 'openssl'
=> true
>> OpenSSL::Digest.new('sha512')
RuntimeError: Unsupported digest algorithm (sha512)
>> OpenSSL::OPENSSL_VERSION_NUMBER.to_s(16)
"9070cf"
This tells me that Ruby isn't finding the local version of OpenSSL that I just built, which should be at least 0x908000. The relevant code:
# file: usr/lib/ruby/2.0.0/openssl/digest.rb
...
alg = %w(DSS DSS1 MD2 MD4 MD5 MDC2 RIPEMD160 SHA SHA1)
if OPENSSL_VERSION_NUMBER > 0x00908000
alg += %w(SHA224 SHA256 SHA384 SHA512)
end
explains why it's not finding SHA512.
But I don't know why Ruby is using the old version of OpenSSL. I built OpenSSL and Ruby from fresh sources using
SANDBOX=/Users/me/sandboxes/ruby2
PATH=$(SANDBOX)/usr/bin:$(PATH)
# Create a fresh OpenSSL from sources
(downloaded and unpacked
$ ./config --prefix=$(SANDBOX)/usr --openssldir=$(SANDBOX)/usr/openssl
$ make ; make install ; make clean
# verify openssl
$ which openssl
/Users/me/sandboxes/ruby2/usr/bin/openssl
$ openssl version
OpenSSL 1.0.1e 11 Feb 2013
# Create a fresh Ruby from sources
(download and unpack
$ ./configure --prefix=$(SANDBOX)/usr --with-open-ssl-dir=$(SANDBOX)/usr/openssl
$ make ; make intalll ; make clean
# verify ruby
$ which ruby
/Users/me/sandboxes/ruby2/usr/bin/ruby
But this ruby doesn't appear to find the openssl 1.0.1e that I just built.
My understanding was that the `--with-open-ssl-dir` argument to `./configure` was necessary and sufficient to tell ruby to use the new OpenSSL, but that didn't seem to work.
Any ideas on how to get Ruby to recognize the new OpenSSL that I've built?
I've tried running `ruby extconf.rb ; make ; make install` as suggested by @Gaurish (below), but that still finds the OpenSSL installed in the system, not in my project root directory.
First the error(s):
$ gem install activesupport -v '3.2.13'
Error while executing gem ... (RuntimeError)
Unsupported digest algorithm (SHA512)
If I go directly into irb, I can see that Ruby is using the "old" openssl:
$ irb
>> require 'openssl'
=> true
>> OpenSSL::Digest.new('sha512')
RuntimeError: Unsupported digest algorithm (sha512)
>> OpenSSL::OPENSSL_VERSION_NUMBER.to_s(16)
"9070cf"
This tells me that Ruby isn't finding the local version of OpenSSL that I just built, which should be at least 0x908000. The relevant code:
# file: usr/lib/ruby/2.0.0/openssl/digest.rb
...
alg = %w(DSS DSS1 MD2 MD4 MD5 MDC2 RIPEMD160 SHA SHA1)
if OPENSSL_VERSION_NUMBER > 0x00908000
alg += %w(SHA224 SHA256 SHA384 SHA512)
end
explains why it's not finding SHA512.
But I don't know why Ruby is using the old version of OpenSSL. I built OpenSSL and Ruby from fresh sources using
SANDBOX=/Users/me/sandboxes/ruby2
PATH=$(SANDBOX)/usr/bin:$(PATH)
# Create a fresh OpenSSL from sources
(downloaded and unpacked
[To see links please register here]
)$ ./config --prefix=$(SANDBOX)/usr --openssldir=$(SANDBOX)/usr/openssl
$ make ; make install ; make clean
# verify openssl
$ which openssl
/Users/me/sandboxes/ruby2/usr/bin/openssl
$ openssl version
OpenSSL 1.0.1e 11 Feb 2013
# Create a fresh Ruby from sources
(download and unpack
[To see links please register here]
)$ ./configure --prefix=$(SANDBOX)/usr --with-open-ssl-dir=$(SANDBOX)/usr/openssl
$ make ; make intalll ; make clean
# verify ruby
$ which ruby
/Users/me/sandboxes/ruby2/usr/bin/ruby
But this ruby doesn't appear to find the openssl 1.0.1e that I just built.
My understanding was that the `--with-open-ssl-dir` argument to `./configure` was necessary and sufficient to tell ruby to use the new OpenSSL, but that didn't seem to work.
Any ideas on how to get Ruby to recognize the new OpenSSL that I've built?
I've tried running `ruby extconf.rb ; make ; make install` as suggested by @Gaurish (below), but that still finds the OpenSSL installed in the system, not in my project root directory.