Ruby编码主题来自x509证书

时间:2015-08-20 19:04:12

标签: ruby encoding openssl

我需要帮助

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 进行编码?

1 个答案:

答案 0 :(得分:1)

我在搜索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
祝你好运!