質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2250閲覧

RubyでX509 証明書の非公開鍵を使ってJWTを作成する方法を知りたいです。

tako7

総合スコア7

Salesforce

Salesforceは、クラウド型の顧客関係管理(CRM)、営業支援(SFA)などのサービスを提供している企業。米カリフォルニア州に本社があり、日本法人は株式会社セールスフォース・ドットコムです。

JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/06/24 14:17

やろうとしていること

salesforceにパラメータを送るアプリをRubyで作成しており、その過程でJWTを使用し、認証を行いたいと考えております。
ドキュメントや調べて出てきた海外の記事を参考にX509証明書の非公開鍵の設定以外はできたように思えます。

#試したこと

こちらが試したコードです。

Ruby

1class Salesforce 2 def initialize 3 @cert_file = File.join(File.dirname(__FILE__), *%w[server.crt]) 4 @base_url = "https://test.salesforce.com" 5 @auth_endpoint = "/services/oauth2/authorize" 6 @token_request_endpoint = "/services/oauth2/token" 7 @token_revoke_endpoint = "/services/oauth2/revoke" 8 @username = "aaaa@example.com" 9 @client_id = "3skfjgboabsofb@oaVFpKVtiEqqcOqBfzgasflganoKHyasfdasgI" 10 @private_key = OpenSSL::PKey::RSA.new(File.read(@cert_file))  ←ここでエラーが出ます。 11 end 12 13 14 def claim_set 15 { 16 iss: @client_id, 17 sub: @username, 18 aud: @base_url, 19 exp: (Time.now + 3.minutes).to_i.to_s 20 } 21 end 22 23 def jwt_bearer_token 24 JWT.encode(self.claim_set.to_s, @private_key, 'RS256') 25 end 26 27 def request_auth 28 post = {grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer", assertion: jwt_bearer_token} 29 uri = URI.parse("#{@base_url}#{@token_request_endpoint}") 30 https = Net::HTTP.new(uri.host, 443) 31 https.use_ssl = true 32 response = https.post(uri.path, post.to_query) 33 print response.body 34 end 35 print Salesforce.new.request_auth 36end 37

エラー内容

`initialize': Neither PUB key nor PRIV key: nested asn1 error (OpenSSL::PKey::RSAError)

参考

参考にしているのはこちらです。
セールスフォースドキュメント
https://help.salesforce.com/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm&type=5

こちらを参考にしました。
https://salesforce.stackexchange.com/questions/274811/ruby-oauth-2-0-jwt-bearer-token-flow

こちらではpem形式のものは別に変換する可能性があるかもしれないとのことです。
また、パスワードのミスがあるという場合もあるようです。
あとは、\nを入れるという方法も書いてあります。
https://stackoverflow.com/questions/2293608/what-causes-neither-pub-key-nor-priv-key-nested-asn1-error-when-building-a-p

すみませんがよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matobaa

2021/06/24 15:27

ご確認いただきたいのですが、server.crt の一行目は意図したとおり `-----BEGIN PRIVATE KEY-----` または `-----BEGIN RSA PRIVATE KEY-----` になっていますでしょうか?
tako7

2021/06/25 00:32

ご質問ありがとうございます。 server.crtの一行目はこのようになっています。 -----BEGIN CERTIFICATE----- 他の方の投稿を見ていると `-----BEGIN RSA PRIVATE KEY-----` という表記が多かったので、気にはなっていました。 そもそも証明書の作成の仕方が間違っていたということでしょうか。
tako7

2021/06/25 01:05 編集

すみません、ご指摘頂いた通り、`-----BEGIN RSA PRIVATE KEY-----`から始まるRSAのprivate keyを改めて作成し、セットしたところエラーは解決しました。証明書の発行方法がわからないので、調べてsalesforceに登録する必要はありますが。 ありがとうございました。
matobaa

2021/06/25 01:53

「公式docに書かれている通り、X509証明書を作成しました」というのが具体的にどのような手順を踏んだのかわからなかったのですが、「JKSに格納されている証明書を取り出して保存した」ということでしょうか? もし手元にPEM形式などの非公開鍵を持っておらず、JKS内に PrivateKeyEntryがあって RSA private key が格納されているのであれば、 keytool を使ってPKCS#12形式で取り出し、openssl を使って PEM形式に変換できるかと思います。 "deststoretype PKCS12" で検索してみてください。
tako7

2021/06/25 02:39

手元にPEM形式の非公開鍵があり、それを用いて証明書を発行し、salesforce側に保存したところエラーは無くなりました。 ありがとうございます。
matobaa

2021/06/25 03:08

おお、解決ですね。まとめを記載して自己解決まで進めていただけるとありがたいです。
guest

回答1

0

自己解決

下記の部分でRSAのpriate_keyを読み込もうとしているにもかかわらず、@cert_fileで読み込んでいるのが、-----BEGIN CERTIFICATE-----から始まる証明書だったことが原因だったようです。

Ruby

1 OpenSSL::PKey::RSA.new(File.read(@cert_file)) 

この@cert_fileを-----BEGIN RSA PRIVATE KEY-----から始まるRSAのprivate key を設定したところエラーは起きなくなりました。

ご指摘いただきありがとうございました。

投稿2021/06/25 03:43

tako7

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問