<?xml version="1.0"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>CRIN Trac: Ticket #114: Update TLS certs for MySQL</title>
    <link>https://trac.crin.org/trac/ticket/114</link>
    <description>&lt;p&gt;
The TLS certs for MySQL connections between the servers are due to expire on 7th May 2017 so need to be updated.
&lt;/p&gt;
&lt;p&gt;
Peter, Russell, I have added you just so you know this is happening, it'll involve restarting MySQL when the new keys and certs are in place, so there might be a few moments of site downtime, but I'll do this on the dev/staging sever first.
&lt;/p&gt;
</description>
    <language>en-us</language>
    <image>
      <title>CRIN Trac</title>
      <url>https://trac.crin.org/trac/chrome/site/logo.gif</url>
      <link>https://trac.crin.org/trac/ticket/114</link>
    </image>
    <generator>Trac 1.0.2</generator>
    <item>
      
        <dc:creator>chris</dc:creator>

      <pubDate>Fri, 05 May 2017 12:47:16 GMT</pubDate>
      <title>hours changed; totalhours set</title>
      <link>https://trac.crin.org/trac/ticket/114#comment:1</link>
      <guid isPermaLink="false">https://trac.crin.org/trac/ticket/114#comment:1</guid>
      <description>
          &lt;ul&gt;
            &lt;li&gt;&lt;strong&gt;hours&lt;/strong&gt;
                changed from &lt;em&gt;0&lt;/em&gt; to &lt;em&gt;0.5&lt;/em&gt;
            &lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;totalhours&lt;/strong&gt;
                set to &lt;em&gt;0.5&lt;/em&gt;
            &lt;/li&gt;
          &lt;/ul&gt;
        &lt;p&gt;
The TLS certs were originally set up on &lt;a class="closed ticket" href="https://trac.crin.org/trac/ticket/8" title="task: Install phpMyAdmin on crin1 and enable encrypted connections from crin2 (closed: fixed)"&gt;#8&lt;/a&gt;, looking at the existing config files, this is what we have on &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin1"&gt;Crin1&lt;/a&gt; in &lt;tt&gt;/etc/mysql/my.cnf&lt;/tt&gt;:
&lt;/p&gt;
&lt;pre class="wiki"&gt;ssl=on
ssl-cipher=DHE-RSA-AES256-SHA
ssl-ca=/etc/ssl/cacert/cacert.pem
ssl-cert=/etc/ssl/cacert/crin1_cert.pem
ssl-key=/etc/ssl/cacert/crin1_yassl_privatekey.pem
&lt;/pre&gt;&lt;p&gt;
And these are the files we have on &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin1"&gt;Crin1&lt;/a&gt;:
&lt;/p&gt;
&lt;pre class="wiki"&gt;ls -lah /etc/ssl/cacert/
total 60K
drwxr-xr-x 3 root mysql 4.0K May  8  2015 .
drwxr-xr-x 6 root root  4.0K Jan 27 20:16 ..
-rw-r--r-- 1 root mysql 5.1K May  3  2015 cacert.pem
-rw------- 1 root mysql 2.6K May 23  2011 class3.crt
-rw-r--r-- 1 root mysql 2.0K May  8  2015 crin1_cert.pem
-rw-r--r-- 1 root mysql 1.1K May  8  2015 crin1_csr.pem
-rw-r--r-- 1 root mysql 1.7K May  8  2015 crin1_privatekey.pem
-rw-r--r-- 1 root mysql 1.7K May  8  2015 crin1_yassl_privatekey.pem
-rw-r--r-- 1 root mysql 2.0K May  8  2015 crin2_cert.pem
-rw-r--r-- 1 root mysql 1.1K May  8  2015 crin2_csr.pem
-rw-r--r-- 1 root mysql 1.7K May  8  2015 crin2_privatekey.pem
-rw-r--r-- 1 root mysql 1.7K May  8  2015 crin2_yassl_privatekey.pem
drwxr-xr-x 2 root root  4.0K May  8  2015 old
-rw------- 1 root mysql 2.6K Oct 11  2004 root.crt
&lt;/pre&gt;&lt;p&gt;
And these are the files on &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin2"&gt;Crin2&lt;/a&gt;:
&lt;/p&gt;
&lt;pre class="wiki"&gt;ls /etc/ssl/cacert/ -lah
total 68K
drwxr-xr-x 3 root www-data 4.0K May  8  2015 .
drwxr-xr-x 6 root root     4.0K Jan 27 20:17 ..
-rw-r--r-- 1 root www-data 5.1K May  3  2015 cacert.pem
-rw-r--r-- 1 root www-data 2.6K May 23  2011 class3.crt
-rw-r--r-- 1 root www-data 2.0K May  8  2015 crin1_cert.pem
-rw-r--r-- 1 root www-data 1.1K May  8  2015 crin1_csr.pem
-rw-r--r-- 1 root www-data 1.7K May  8  2015 crin1_privatekey.pem
-rw-r--r-- 1 root www-data 1.7K May  8  2015 crin1_yassl_privatekey.pem
-rw-r--r-- 1 root www-data 7.1K May  8  2015 crin2_cert.chained.pem
-rw-r--r-- 1 root www-data 2.0K May  8  2015 crin2_cert.pem
-rw-r--r-- 1 root www-data 1.1K May  8  2015 crin2_csr.pem
-rw-r--r-- 1 root www-data 1.7K May  8  2015 crin2_privatekey.pem
-rw-r--r-- 1 root www-data 1.7K May  8  2015 crin2_yassl_privatekey.pem
drwxr-xr-x 2 root root     4.0K May  8  2015 old
-rw-r--r-- 1 root www-data 2.6K Oct 11  2004 root.crt
&lt;/pre&gt;&lt;p&gt;
And on &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin2"&gt;Crin2&lt;/a&gt; we have this &lt;tt&gt;/root/.my.cnf&lt;/tt&gt; file (passwd redacted)
&lt;/p&gt;
&lt;pre class="wiki"&gt;[client]
host=crin1
user = root
password = XXX
ssl-cipher=DHE-RSA-AES256-SHA
ssl-ca=/etc/ssl/cacert/cacert.pem
ssl-cert=/etc/ssl/cacert/crin1_cert.pem
ssl-key=/etc/ssl/cacert/crin1_yassl_privatekey.pem
&lt;/pre&gt;&lt;p&gt;
And on &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin4"&gt;Crin4&lt;/a&gt; the &lt;tt&gt;/root/.my.cnf&lt;/tt&gt; file:
&lt;/p&gt;
&lt;pre class="wiki"&gt;[client]
host=crin1
ssl-cipher=DHE-RSA-AES256-SHA
ssl-ca=/etc/ssl/cacert/cacert.pem
ssl-cert=/etc/ssl/cacert/crin1_cert.pem
ssl-key=/etc/ssl/cacert/crin1_yassl_privatekey.pem
&lt;/pre&gt;&lt;p&gt;
Checking the names in certs:
&lt;/p&gt;
&lt;pre class="wiki"&gt;aptitude install gnutls-bin
certtool -i &amp;lt; crin1_cert.pem
        Subject: CN=crin1.crin.org
                Subject Alternative Name (not critical):
                        DNSname: crin1.crin.org
                        XMPP Address: crin1.crin.org
                        DNSname: *.crin1.crin.org
                        XMPP Address: *.crin1.crin.org
                        DNSname: *.crin.org
                        XMPP Address: *.crin.org
                        DNSname: crin1.webarch.net
                        XMPP Address: crin1.webarch.net
                        DNSname: *.crin1.webarch.net
                        XMPP Address: *.crin1.webarch.net
certtool -i &amp;lt; crin2_cert.pem
        Subject: CN=crin2.crin.org
                Subject Alternative Name (not critical):
                        DNSname: crin2.crin.org
                        XMPP Address: crin2.crin.org
                        DNSname: *.crin2.crin.org
                        XMPP Address: *.crin2.crin.org
                        DNSname: *.crin.org
                        XMPP Address: *.crin.org
                        DNSname: crin2.webarch.net
                        XMPP Address: crin2.webarch.net
                        DNSname: *.crin2.webarch.net
                        XMPP Address: *.crin2.webarch.net
certtool -i &amp;lt; crin4_cert.pem
        Subject: CN=crin4.crin.org
                Subject Alternative Name (not critical):
                        DNSname: crin4.crin.org
                        XMPP Address: crin4.crin.org
                        DNSname: *.crin4.crin.org
                        XMPP Address: *.crin4.crin.org
                        DNSname: dev.crin.org
                        XMPP Address: dev.crin.org
                        DNSname: stage.crin.org
                        XMPP Address: stage.crin.org
                        DNSname: crin4.webarch.net
                        XMPP Address: crin4.webarch.net
                        DNSname: *.crin4.webarch.net
                        XMPP Address: *.crin4.webarch.net
&lt;/pre&gt;&lt;p&gt;
So what needs to be done:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Create a &lt;tt&gt;/etc/ssl/cacert/new&lt;/tt&gt; directory for all the new files
&lt;/li&gt;&lt;li&gt;Generate new keys and certs with matching Subject and subjectAltNames
&lt;/li&gt;&lt;li&gt;Generate the yassl and chained versions
&lt;/li&gt;&lt;li&gt;rsync everything between all the servers
&lt;/li&gt;&lt;li&gt;switch the old files for the new files
&lt;/li&gt;&lt;li&gt;restart mysqld on &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin1"&gt;Crin1&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;
      </description>
      <category>Ticket</category>
    </item><item>
      
        <dc:creator>chris</dc:creator>

      <pubDate>Fri, 05 May 2017 14:03:38 GMT</pubDate>
      <title>hours, totalhours changed</title>
      <link>https://trac.crin.org/trac/ticket/114#comment:2</link>
      <guid isPermaLink="false">https://trac.crin.org/trac/ticket/114#comment:2</guid>
      <description>
          &lt;ul&gt;
            &lt;li&gt;&lt;strong&gt;hours&lt;/strong&gt;
                changed from &lt;em&gt;0&lt;/em&gt; to &lt;em&gt;1.25&lt;/em&gt;
            &lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;totalhours&lt;/strong&gt;
                changed from &lt;em&gt;0.5&lt;/em&gt; to &lt;em&gt;1.75&lt;/em&gt;
            &lt;/li&gt;
          &lt;/ul&gt;
        &lt;p&gt;
So generating certs on &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin1"&gt;Crin1&lt;/a&gt;:
&lt;/p&gt;
&lt;pre class="wiki"&gt;cd /etc/ssl/cacert/
mkdir new
cd new
/root/bin/csr
Short Hostname (ie. imap big_srv www2): crin1
FQDN/CommonName (ie. www.example.com) : crin1.crin.org
Type SubjectAltNames for the certificate, one per line. Enter a blank line to finish
SubjectAltName: DNS:crin1.crin.org
SubjectAltName: DNS:*.crin1.crin.org
SubjectAltName: DNS:*.crin.org
SubjectAltName: DNS:crin1.webarch.net
SubjectAltName: DNS:*.crin1.webarch.net
vi crin1_cert.pem
mv /root/crin1_privatekey.pem .
/root/bin/csr
Short Hostname (ie. imap big_srv www2): crin2
FQDN/CommonName (ie. www.example.com) : crin2.crin.org
Type SubjectAltNames for the certificate, one per line. Enter a blank line to finish
SubjectAltName: DNS:crin2.crin.org
SubjectAltName: DNS:*.crin2.crin.org
SubjectAltName: DNS:*.crin.org
SubjectAltName: DNS:crin2.webarch.net
SubjectAltName: DNS:*.crin2.webarch.net
vi crin2_cert.pem
mv /root/crin2_privatekey.pem .
/root/bin/csr
Short Hostname (ie. imap big_srv www2): crin4
FQDN/CommonName (ie. www.example.com) : crin4.crin.org
Type SubjectAltNames for the certificate, one per line. Enter a blank line to finish
SubjectAltName: DNS:crin4.crin.org
SubjectAltName: DNS:*.crin4.crin.org
SubjectAltName: DNS:dev.crin.org
SubjectAltName: DNS:stage.crin.org
SubjectAltName: DNS:crin4.webarch.net
SubjectAltName: DNS:*.crin4.webarch.net
vi crin4_cert.pem
mv /root/crin4_privatekey.pem .
openssl rsa -in crin1_privatekey.pem -out crin1_yassl_privatekey.pem
openssl rsa -in crin2_privatekey.pem -out crin2_yassl_privatekey.pem
openssl rsa -in crin4_privatekey.pem -out crin4_yassl_privatekey.pem
wget https://www.cacert.org/certs/root.crt --no-check-certificate
wget https://www.cacert.org/certs/class3.crt --no-check-certificate
cat root.crt &amp;gt; cacert.pem
cat class3.crt &amp;gt;&amp;gt; cacert.pem
cat crin2_cert.pem &amp;gt; crin2_cert.chained.pem
cat cacert.pem &amp;gt;&amp;gt; crin2_cert.chained.pem
cat crin4_cert.pem &amp;gt; crin4_cert.chained.pem
cat cacert.pem &amp;gt;&amp;gt; crin4_cert.chained.pem
chown root:mysql *.*
chmod 644 *.*
&lt;/pre&gt;&lt;p&gt;
And now we should have a full set of files:
&lt;/p&gt;
&lt;pre class="wiki"&gt;root@crin1:/etc/ssl/cacert/new# ls -lah
total 76K
drwxr-xr-x 2 root root  4.0K May  5 13:23 .
drwxr-xr-x 4 root mysql 4.0K May  5 12:50 ..
-rw-r--r-- 1 root mysql 5.1K May  5 13:22 cacert.pem
-rw-r--r-- 1 root mysql 2.6K May 23  2011 class3.crt
-rw-r--r-- 1 root mysql 2.0K May  5 13:09 crin1_cert.pem
-rw-r--r-- 1 root mysql 1.7K May  5 12:52 crin1_privatekey.pem
-rw-r--r-- 1 root mysql 1.7K May  5 13:23 crin1_yassl_privatekey.pem
-rw-r--r-- 1 root mysql 7.1K May  5 13:22 crin2_cert.chained.pem
-rw-r--r-- 1 root mysql 2.0K May  5 13:12 crin2_cert.pem
-rw-r--r-- 1 root mysql 1.7K May  5 13:11 crin2_privatekey.pem
-rw-r--r-- 1 root mysql 1.7K May  5 13:23 crin2_yassl_privatekey.pem
-rw-r--r-- 1 root mysql 7.2K May  5 13:22 crin4_cert.chained.pem
-rw-r--r-- 1 root mysql 2.1K May  5 13:18 crin4_cert.pem
-rw-r--r-- 1 root mysql 1.7K May  5 13:18 crin4_privatekey.pem
-rw-r--r-- 1 root mysql 1.7K May  5 13:23 crin4_yassl_privatekey.pem
-rw-r--r-- 1 root mysql 2.6K Oct 11  2004 root.crt
&lt;/pre&gt;&lt;p&gt;
Sync them between the servers:
&lt;/p&gt;
&lt;pre class="wiki"&gt;rsync -av /etc/ssl/cacert/new/ crin2:/etc/ssl/cacert/new/
rsync -av /etc/ssl/cacert/new/ crin4:/etc/ssl/cacert/new/
&lt;/pre&gt;&lt;p&gt;
So first stop the MySQL server on &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin1"&gt;Crin1&lt;/a&gt;:
&lt;/p&gt;
&lt;pre class="wiki"&gt;/etc/init.d/mysql stop
&lt;/pre&gt;&lt;p&gt;
And now the commands to make them live on each server:
&lt;/p&gt;
&lt;pre class="wiki"&gt;cd /etc/ssl/cacert
mv crin* old/
mv new/* .
&lt;/pre&gt;&lt;p&gt;
And restart MySQL on &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin1"&gt;Crin1&lt;/a&gt;:
&lt;/p&gt;
&lt;pre class="wiki"&gt;/etc/init.d/mysql start
&lt;/pre&gt;&lt;p&gt;
And to test from &lt;a class="wiki" href="https://trac.crin.org/trac/wiki/Crin2"&gt;Crin2&lt;/a&gt;:
&lt;/p&gt;
&lt;pre class="wiki"&gt;mysql -h crin1 -u root newprod
&lt;/pre&gt;&lt;p&gt;
And in the event of that not working, we might need to revert, if we do the commands:
&lt;/p&gt;
&lt;pre class="wiki"&gt;cd /etc/ssl/cacert
mv crin* new/
mv old/crin* .
&lt;/pre&gt;&lt;p&gt;
But thankfully that wasn't needed and it restarted OK and the site is fine.
&lt;/p&gt;
&lt;p&gt;
Checked the Munin stats:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a class="ext-link" href="https://munin.crin.org/munin/crin.org/crin1.crin.org/index.html#mysql2"&gt;&lt;span class="icon"&gt;​&lt;/span&gt;https://munin.crin.org/munin/crin.org/crin1.crin.org/index.html#mysql2&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
And the results of mysqltuner:
&lt;/p&gt;
&lt;pre class="wiki"&gt;mysqltuner
 &amp;gt;&amp;gt;  MySQLTuner 1.3.0 - Major Hayden &amp;lt;major@mhtx.net&amp;gt;
 &amp;gt;&amp;gt;  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 &amp;gt;&amp;gt;  Run with '--help' for additional options and output filtering
[OK] Logged in using credentials from debian maintenance account.
[OK] Currently running supported MySQL version 5.5.55-0+deb8u1-log
[OK] Operating on 64-bit architecture
-------- Storage Engine Statistics -------------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM
[--] Data in InnoDB tables: 7G (Tables: 1569)
[--] Data in MyISAM tables: 1G (Tables: 13)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[--] Data in MEMORY tables: 0B (Tables: 1)
[!!] Total fragmented tables: 1570
-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned
-------- Performance Metrics -------------------------------------------------
[--] Up for: 1m 52s (11K q [104.268 qps], 331 conn, TX: 11M, RX: 2M)
[--] Reads / Writes: 98% / 2%
[--] Total buffers: 7.5G global + 2.7M per thread (151 max threads)
[!!] Maximum possible memory usage: 7.9G (101% of installed RAM)
[OK] Slow queries: 0% (54/11K)
[OK] Highest usage of available connections: 35% (54/151)
[OK] Key buffer size / total MyISAM indexes: 1.0G/458.3M
[OK] Key buffer hit rate: 100.0% (39 cached / 0 reads)
[OK] Query cache efficiency: 68.1% (7K cached / 10K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 897 sorts)
[!!] Temporary tables created on disk: 31% (186 on disk / 594 total)
[OK] Thread cache hit rate: 79% (68 created / 331 connections)
[!!] Table cache hit rate: 4% (64 open / 1K opened)
[OK] Open file limit used: 0% (3/1K)
[OK] Table locks acquired immediately: 100% (5K immediate / 5K locks)
[!!] InnoDB  buffer pool / data size: 6.0G/7.5G
[OK] InnoDB log waits: 0
-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Reduce your overall MySQL memory footprint for system stability
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
    Increase table_open_cache gradually to avoid file descriptor limits
    Read this before increasing table_open_cache over 64: http://bit.ly/1mi7c4C
Variables to adjust:
  *** MySQL's maximum memory usage is dangerously high ***
  *** Add RAM before increasing MySQL buffer variables ***
    tmp_table_size (&amp;gt; 16M)
    max_heap_table_size (&amp;gt; 16M)
    table_open_cache (&amp;gt; 64)
    innodb_buffer_pool_size (&amp;gt;= 7G)
&lt;/pre&gt;
      </description>
      <category>Ticket</category>
    </item>
 </channel>
</rss>