Techioz Blog

x509証明書からのRubyエンコードサブジェクト

概要

私は助けが必要です

require 'openssl'
Encoding.default_external = Encoding::UTF_8
certificate = OpenSSL::X509::Certificate.new(File.open('!^9e1209.cer'))
puts certificate.subject

この証明書ファイルから: 証明書ファイル 私は次のような件名を取得します:

ただし、この文字列をWindowsコンソールからコピーしてエディタに貼り付けると、次のようになります。

Encoding.default_external = Encoding::UTF_8
puts a = "/C=UA/ST=\xD0\x96\xD0\xB8\xD1\x82\xD0\xBE\xD0\xBC\xD0\xB8\xD1\x80\xD"

わかりました:

証明書から抽出した直後に、certificate.subject をエンコードするにはどうすればよいですか?

解決策

X509 証明書と Ruby に関する別の関連問題を検索しているときに、あなたの質問に遭遇しました。この問題は、ruby/openssl Github リポジトリ (問題 26) ですでに確認されているため、元の質問のコードを使用して自分の問題を解決できます。

require 'openssl'

### Note 1 ###
# I had to look this up in the OpenSSL include files.
# I couldn't find it in ruby anyplace.
ASN1_STRFLGS_ESC_MSB = 4

Encoding.default_external = Encoding::UTF_8
certificate = OpenSSL::X509::Certificate.new(File.open('!^9e1209.cer'))

i_expected_this_to_work = certificate.subject.to_s
puts i_expected_this_to_work
puts i_expected_this_to_work.encoding

# Following instructions from https://wiki.openssl.org/index.php/Manual:X509_NAME_print_ex(3)
# to get UTF-8.
puts
puts 'The "Using magic flags" approach'

oh_so_close = certificate.subject.to_s(OpenSSL::X509::Name::ONELINE & ~ASN1_STRFLGS_ESC_MSB)
puts oh_so_close
puts oh_so_close.encoding

puts
puts 'The "Fix the magic flags" approach'
corrected_approach = oh_so_close.force_encoding(Encoding::UTF_8)
puts corrected_approach
puts corrected_approach.encoding

結果は次のようになります。

/C=UA/ST=\xD0\x96\xD0\xB8\xD1\x82\xD0\xBE\xD0\xBC\xD0\xB8\xD1\x80\xD1\x81\xD1\x8C\xD0\xBA\xD0\xB0/L=\xD0\x96\xD0\xB8\xD1\x82\xD0\xBE\xD0\xBC\xD0\xB8\xD1\x80/O=\xD0\xA3\xD0\xBF\xD1\x80\xD0\xB0\xD0\xB2\xD0\xBB\xD1\x96\xD0\xBD\xD0\xBD\xD1\x8F \xD0\x9D\xD0\x91\xD0\xA3 \xD0\xB2 \xD0\x96\xD0\xB8\xD1\x82\xD0\xBE\xD0\xBC\xD0\xB8\xD1\x80\xD1\x81\xD1\x8C\xD0\xBA\xD1\x96\xD0\xB9 \xD0\xBE\xD0\xB1\xD0\xBB\xD0\xB0\xD1\x81\xD1\x82\xD1\x96/OU=\xD0\x92\xD1\x96\xD0\xB4\xD0\xB4\xD1\x96\xD0\xBB \xD0\xB3\xD0\xBE\xD1\x82\xD1\x96\xD0\xB2\xD0\xBA\xD0\xBE\xD0\xB2\xD0\xBE\xD0\xB3\xD0\xBE \xD0\xBE\xD0\xB1\xD1\x96\xD0\xB3\xD1\x83 \xD1\x96 \xD0\xBA\xD0\xB0\xD1\x81\xD0\xBE\xD0\xB2\xD0\xB8\xD1\x85 \xD0\xBE\xD0\xBF\xD0\xB5\xD1\x80\xD0\xB0\xD1\x86\xD1\x96\xD0\xB9/OU=\xD0\xA1\xD0\xB5\xD0\xBA\xD1\x82\xD0\xBE\xD1\x80 \xD0\xBA\xD0\xB0\xD1\x81\xD0\xBE\xD0\xB2\xD0\xB8\xD1\x85 \xD0\xBE\xD0\xBF\xD0\xB5\xD1\x80\xD0\xB0\xD1\x86\xD1\x96\xD0\xB9 \xD1\x82\xD0\xB0 \xD0\xB7\xD0\xB1\xD0\xB5\xD1\x80\xD1\x96\xD0\xB3\xD0\xB0\xD0\xBD\xD0\xBD\xD1\x8F \xD1\x86\xD1\x96\xD0\xBD\xD0\xBD\xD0\xBE\xD1\x81\xD1\x82\xD0\xB5\xD0\xB9/title=\xD1\x81\xD1\x82\xD0\xB0\xD1\x80\xD1\x88\xD0\xB8\xD0\xB9 \xD0\xBA\xD0\xB0\xD1\x81\xD0\xB8\xD1\x80/CN=\xD0\x91\xD0\xBE\xD0\xB4\xD1\x80\xD0\xBE\xD0\xB2 \xD0\x9C\xD0\xB8\xD0\xBA\xD0\xBE\xD0\xBB\xD0\xB0 \xD0\x9F\xD0\xB5\xD1\x82\xD1\x80\xD0\xBE\xD0\xB2\xD0\xB8\xD1\x87/serialNumber=00000DF9/UID=9E1209
ASCII-8BIT

The "Using magic flags" approach
C = UA, ST = Житомирська, L = Житомир, O = Управління НБУ в Житомирській області, OU = Відділ готівкового обігу і касових операцій, OU = Сектор касових операцій та зберігання цінностей, title = старший касир, CN = Бодров Микола Петрович, serialNumber = 00000DF9, UID = 9E1209
ASCII-8BIT

The "Fix the magic flags" approach
C = UA, ST = Житомирська, L = Житомир, O = Управління НБУ в Житомирській області, OU = Відділ готівкового обігу і касових операцій, OU = Сектор касових операцій та зберігання цінностей, title = старший касир, CN = Бодров Микола Петрович, serialNumber = 00000DF9, UID = 9E1209
UTF-8

幸運を!