実稼働環境の3台のマシンにハードウェアの問題があり、廃止されました。インフラストラクチャチームはそれらを再インストールし、同じホスト名とIPアドレスを与えました。これらのシステムでPuppetを実行して、再度コミッショニングできるようにすることが目的です。
試行
1)次のコマンドを発行して、古いPuppet証明書をPuppetmasterから削除しました。
puppet cert revoke grb16.company.com
puppet cert clean grb16.company.com
2)古い証明書が削除されると、再インストールされたノードの1つから次のコマンドを発行して、新しい証明書要求が作成されました。
[root@grb16 ~]# puppet agent -t
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for grb16.company.com
Info: Certificate Request fingerprint (SHA256): 6F:2D:1D:71:67:18:99:86:2C:22:A1:14:80:55:34:35:FD:20:88:1F:36:ED:A7:7B:2A:12:09:4D:F8:EC:BF:6D
Exiting; no certificate found and waitforcert is disabled
[root@grb16 ~]#
3)証明書リクエストがPuppetmasterに表示されると、次のコマンドが発行されて証明書リクエストに署名しました。
[root@foreman ~]# puppet cert sign grb16.company.com
Notice: Signed certificate request for grb16.company.com
Notice: Removing file Puppet::SSL::CertificateRequest grb16.company.com at '/var/lib/puppet/ssl/ca/requests/grb16.company.com.pem'
[root@foreman ~]#
問題
証明書リクエストが署名され、Puppetの実行が開始されると、次のエラーがスローされます。
[root@grb16 ~]# puppet agent -t
Info: Caching certificate for grb16.company.com
Error: Could not request certificate: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Exiting; failed to retrieve certificate and waitforcert is disabled
[root@grb16 ~]#
Puppetを2回実行すると、次の結果になります。
[root@grb16 ~]# puppet agent -t
Warning: Unable to fetch my node definition, but the agent run will continue:
Warning: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Info: Retrieving pluginfacts
Error: /File[/var/lib/puppet/facts.d]: Failed to generate additional resources using 'eval_generate': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Error: /File[/var/lib/puppet/facts.d]: Could not evaluate: Could not retrieve file metadata for puppet://foreman.company.com/pluginfacts: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Wrapped exception:
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Info: Retrieving plugin
Error: /File[/var/lib/puppet/lib]: Failed to generate additional resources using 'eval_generate': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Error: /File[/var/lib/puppet/lib]: Could not evaluate: Could not retrieve file metadata for puppet://foreman.company.com/plugins: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Wrapped exception:
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Error: Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
Error: Could not send report: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [CRL is not yet valid for /CN=Puppet CA: foreman.company.com]
[root@grb16 ~]#
分析
この問題を解決するために、エラーメッセージを調査しましたが、問題はSSLまたはPuppetに関連しているようです。これらのパッケージの1つが正しくインストールされていないか、再インストールされたノードに誤ったバージョンがインストールされている可能性があります。
パペット
[root@grb16 ~]# yum list installed |grep puppet
facter.x86_64 1:2.3.0-1.el6 @puppetlabs_6_products
hiera.noarch 1.3.4-1.el6 @puppetlabs_6_products
puppet.noarch 3.7.3-1.el6 @puppetlabs_6_products
puppetlabs-release.noarch
6-11 @puppetlabs_6_products
Ruby-augeas.x86_64 0.4.1-3.el6 @puppetlabs_6_deps
Ruby-shadow.x86_64 1:2.2.0-2.el6 @puppetlabs_6_deps
rubygem-json.x86_64 1.5.5-3.el6 @puppetlabs_6_deps
[〜#〜] ssl [〜#〜]
[root@grb16 ~]# yum list installed |grep ssl
nss_compat_ossl.x86_64 0.9.6-1.el6 @anaconda-CentOS-201410241409.x86_64/6.6
openssl.x86_64 1.0.1e-30.el6_6.4
openssl-devel.x86_64 1.0.1e-30.el6_6.4
[root@grb16 ~]#
さまざまなサーバーにインストールされているSSLパッケージとPuppetパッケージの間に違いはありませんでした。廃止または再インストールされていないシステムでも、Puppetを実行できます。問題は再インストールされたサーバーに限定されます。再インストールされた他の2つのサーバーではPuppetが実行されていないことに注意してください。この問題の原因と解決方法を教えてください。
簡潔な答え
問題CRL is not yet valid for
は、 Puppet-agentとPuppetmasterの間の時間が同期していない であることを示しています。時刻を同期します(NTP)。 Puppet-agentおよびPuppetmasterからも証明書を削除し、エージェントでPuppetを実行します。
包括的な答え
CRL is not yet valid for
は次のスニペットにあります。
以下のテストコードスニペット は、問題の原因を説明しています。
it 'includes the CRL issuer in the verify error message' do
crl = OpenSSL::X509::CRL.new
crl.issuer = OpenSSL::X509::Name.new([['CN','Puppet CA: puppetmaster.example.com']])
crl.last_update = Time.now + 24 * 60 * 60
ssl_context.stubs(:current_crl).returns(crl)
subject.call(false, ssl_context)
expect(subject.verify_errors).to eq(["CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com"])
end
ssl_context
let(:ssl_context) do
mock('OpenSSL::X509::StoreContext')
end
subject
subject do
described_class.new(ssl_configuration,
ssl_Host)
end
コードには OpenSSL :: X509 :: CRL クラスのスニペットが含まれています。
発行者=(p1)
static VALUE
ossl_x509crl_set_issuer(VALUE self, VALUE issuer)
{
X509_CRL *crl;
GetX509CRL(self, crl);
if (!X509_CRL_set_issuer_name(crl, GetX509NamePtr(issuer))) { /* DUPs name */
ossl_raise(eX509CRLError, NULL);
}
return issuer;
}
last_update =(p1)
static VALUE
ossl_x509crl_set_last_update(VALUE self, VALUE time)
{
X509_CRL *crl;
time_t sec;
sec = time_to_time_t(time);
GetX509CRL(self, crl);
if (!X509_time_adj(crl->crl->lastUpdate, 0, &sec)) {
ossl_raise(eX509CRLError, NULL);
}
return time;
}
last_updated時刻は現在時刻に1日追加したものであり、call関数を呼び出すサブジェクト関数に渡されますdefault_validator class にあります。
class Puppet::SSL::Validator::DefaultValidator #< class Puppet::SSL::Validator
attr_reader :peer_certs
attr_reader :verify_errors
attr_reader :ssl_configuration
FIVE_MINUTES_AS_SECONDS = 5 * 60
def initialize(
ssl_configuration = Puppet::SSL::Configuration.new(
Puppet[:localcacert], {
:ca_auth_file => Puppet[:ssl_client_ca_auth]
}),
ssl_Host = Puppet::SSL::Host.localhost)
reset!
@ssl_configuration = ssl_configuration
@ssl_Host = ssl_Host
end
def call(preverify_ok, store_context)
if preverify_ok
...
else
...
crl = store_context.current_crl
if crl
if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDS
...
else
@verify_errors << "#{error_string} for #{crl.issuer}"
end
...
end
end
end
Preverify_okがfalseの場合、else句が適用されます。 if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDS
の結果はfalseになります。これは、時刻が1日追加されたため、elseステートメントが適用されるためです。 @verify_errors << "#{error_string} for #{crl.issuer}"
の評価はCRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com
になります。
この問題を解決するには:
Sudo puppet cert clean <fqdn-puppet-agent>
を発行して、マスターから証明書を取り消します結論として、Puppet-agentsとPuppetmasterの時間は常に同期されている必要があります。 5分の最大許容偏差を超えると、問題が発生します。
同じ問題に出くわした。
パペットのセットアップはGitHubを使用してバージョン管理されているため、新しいパペットマスターをプロビジョニングするたびに、証明書の問題が発生します。通常は puppet ca --clean --all
は機能しますが、以下の方が信頼性が高いことがわかりました。
rm -rf $(puppet master --configprint ssldir)