Ruby 来自 x509 证书的编码主题
Ruby encoding subject from x509 certificate
我需要帮助
require 'openssl'
Encoding.default_external = Encoding::UTF_8
certificate = OpenSSL::X509::Certificate.new(File.open('!^9e1209.cer'))
puts certificate.subject
来自这个证书文件:
cert file
我得到的主题如下:
: /C=UA/ST=\xD0\x96\xD0\xB8\xD1\x82\xD0\xBE\xD0\xBC\xD0\xB8\xD1\x80\
但如果我从 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"
我得到:
: /C=UA/ST=Житомир
从证书中提取后,我可以立即对 certificate.subject 进行编码吗?
我在搜索与 X509 证书和 Ruby 的另一个相关问题时偶然发现了您的问题。已经在 ruby/openssl Github repository (issue 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
祝你好运!
我需要帮助
require 'openssl'
Encoding.default_external = Encoding::UTF_8
certificate = OpenSSL::X509::Certificate.new(File.open('!^9e1209.cer'))
puts certificate.subject
来自这个证书文件: cert file 我得到的主题如下:
: /C=UA/ST=\xD0\x96\xD0\xB8\xD1\x82\xD0\xBE\xD0\xBC\xD0\xB8\xD1\x80\
但如果我从 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"
我得到:
: /C=UA/ST=Житомир
从证书中提取后,我可以立即对 certificate.subject 进行编码吗?
我在搜索与 X509 证书和 Ruby 的另一个相关问题时偶然发现了您的问题。已经在 ruby/openssl Github repository (issue 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
祝你好运!