11
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Rails】credentials.yaml.encについての一口メモ

Last updated at Posted at 2019-08-30

Recaptcha機能実装に当たってAPIキーを秘匿可能な状態にして呼び出す必要がありました。
が、某スクールカリキュラムでは最新のRailsバージョンを扱っておらず、環境変数を設定しようとして苦戦しました。ENVがどうしても読み込めない!!的なやつです^^;

あまり中身ないですが、メモ程度に残しておきます。
この記事はMacOSで且つターミナルを利用している場合のみに効力を発揮します。

credential.yaml.enc

秘匿する必要がある情報(API秘密鍵やパスワードなど)を外部漏洩させないための仕組みです。(master.keyでcredentials.yaml.encを暗号/復号化して使っている。と言う理解。そのため、master.keyは秘密鍵みたいなもの。こいつでは漏洩させてはダメな奴ですね!)

Rails5.2以降から実装されています。
それまでのバージョンで利用していたsecret.yamlは使えなくなっています。

内容を編集する

プロジェクト作成時点ではファイル自体が存在してません。
また、存在していたとしても暗号化されておりVSCなどから直接参照できません。
編集するためには、ターミナルでプロジェクトフォルダ直下に移動し、以下のコマンドを実行する必要があります。

EDITOR=vim bin/rails credentials:edit

このコマンドを打つことでcredentials.yaml.encとmaster.keyが生成されます。
もし、すでに存在していた場合はファイルを編集し保存することでcredentials.yaml.encが更新されます。

###補足
そもそも以下のようなエラーが出てeditorを開けない!と言う場合があります。
原因としてはcredentials.yaml.encを復号化するためのキーであるmaster.keyの値が間違っている可能性が高いです。
個人でやってるのに上手く行かない…と言う場合は、master.keyとcredential.yaml.encを一旦消して、再作成すると上手く行ったりしました。

ターミナル.
ActiveSupport::MessageEncryptor::InvalidMessage

編集例

作成直後は以下のような状態になっています。

ターミナル.vim
#aws:
#  access_key_id: *******************
#  secret_access_key: ************************
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: **************************

例えば、今回試したReCAPTCHAのapiを足したい場合、こんな感じで追加すればOKです。

ターミナル.vim
#省略#
secret_key_base: **************************

recaptcha:
  RECAPTCHA_SITE_KEY: 'APIキー('は入力不要です)'
  RECAPTCHA_SECRET_KEY: 'APIキー('は入力不要です)'

基本は「キー名: キー値」のセットを書いておけば良いと思ってます。
記載においてハマった点などを以下にまとめました。

【記載における注意点】
 ①見通しを良くする為にgem名やサービス名でタイトルをつけてあげると良いと思います。
  → 上の例で言う'recaptcha:'の部分です。
 ②タイトルを記載した場合、下の段に書くキーの始まりは半角スペースを2又は3つ入れてください。
  (スペース数はファイル内で統一しておくのが望ましいらしいです。メンターさん指摘)
   → スペースが無い、又はタブでインデントを入れた場合はエラーとなります。
 ③'キー名:'の後は必ず半角スペースが1つ必要です。
   → こちらも入れないとエラーになります。
 ④大文字/小文字も厳密に見られているようです。

 ※この辺りは、おそらくyamlの書き方作法なのかな?詳しくは検索してみてください。

成功すれば「New credentials encrypted and saved.」とターミナルに表示されます。
保存時に下記のようならエラーが出た場合、ほぼ間違いなく記載ミスです。見直しましょう。

ターミナル.
`parse': (<unknown>): mapping values are not allowed in this context at line 10 column 23 (Psych::SyntaxError)

動作確認について

このキーの記載。ものすごーく間違いやすいです。
タイプミスなどしていてもcredentials.yaml.encの保存自体はできてしまいます。
ですが、Railsの起動時にconfigのinitializerなどで該当のキー値を参照していた場合、サーバーが起動できなくなるなど、エラーを引き起こします。

その為、設定しようとしたキーが本当に参照できるのかは、事前にチェックしておくことをお勧めします。
チェックはコンソールから簡単にできます。

ターミナル.rb
$ rails c

[1] pry(main)>  Rails.application.credentials.recaptcha[:RECAPTCHA_SITE_KEY]

# OKパターン
 => "キーの値が表示される"

# NGパターン
 => nil

もし、nilが返ってきてしまった場合、コンソールに留まったまま、更に以下のようなコマンドを叩きましょう。そうするとcredentials.yaml.encの中身を参照することができます。
今回の例で見ると':RECAPTCHA_SITE_KE’となっており、誤字があるのが分かります。

ターミナル.rb
[2] pry(main)>  Rails.application.credentials
 =>  @config=
  {:recaptcha=>{:RECAPTCHA_SITE_KE=>"キー値", :RECAPTCHA_SECRET_KEY=>"キー値"},
  @content_path= '・・・以下略・・・'  

もし、そもそも「Rails.application.credentials」が見れないようなら、何かしらyamlの文法に則っていない書き方をしている可能性があります。今一度確認をしてみてください。

キーの呼び出し方

credentials.yaml.encに書いたキーは以下のように記載することで呼び出しが可能です。
以下にReCAPTCHAの例を記載します。

recaptcha.rb

Recaptcha.configure do |config|
  config.site_key = Rails.application.credentials.recaptcha[:RECAPTCHA_SITE_KEY]
  config.secret_key = Rails.application.credentials.recaptcha[:RECAPTCHA_SECRET_KEY]
end

デフォルトで'Rails.application.credentials'は必ず書きます。
そこにタイトルをつけた人は、.'タイトル名’を書き、続けて[:キー名]を記載してください。

#GitHubについて
GitHubを利用している場合の共有方法ですが、credentials.yaml.encは基本的にGitHubに共有してしまって良いようです。暗号化されてるし。
ただし、それらの復号化キーであるmaster.keyは必ず'.gitignore'に記述し、GitHubの管理対象から外す必要があります。とは言え、master.keyができた段階で自動的に対象外指定が入るようですので、特に気にすることはありません。間違って消すことの無いようにだけ、注意しましょう。

#まとめ
分かってしまえば簡単!
ただ、GitHubを使ったチーム開発時のmaster.key管理には注意です!

間違っているところなどがあれば、ご指摘いただけると嬉しいです。

11
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?