Forcing Centovacast to work with SSL

By Gene Turnbow, February 28, 2019

[et_pb_section fb_built=”1″ inner_shadow=”on” fullwidth=”on” _builder_version=”3.22.3″ background_color=”#2ea3f2″ use_background_color_gradient=”on” background_color_gradient_start=”#2ea3f2″ background_color_gradient_end=”#2e6df4″ background_color_gradient_direction=”330deg”][et_pb_fullwidth_header title=”Making Centovacast Work with SSL” subhead=”The long, convoluted, exasperating process, all the broken things we found and how to get round them and make the whole thing work anyway.” _builder_version=”3.16″ background_color=”rgba(255, 255, 255, 0)” button_one_text_size__hover_enabled=”off” button_two_text_size__hover_enabled=”off” button_one_text_color__hover_enabled=”off” button_two_text_color__hover_enabled=”off” button_one_border_width__hover_enabled=”off” button_two_border_width__hover_enabled=”off” button_one_border_color__hover_enabled=”off” button_two_border_color__hover_enabled=”off” button_one_border_radius__hover_enabled=”off” button_two_border_radius__hover_enabled=”off” button_one_letter_spacing__hover_enabled=”off” button_two_letter_spacing__hover_enabled=”off” button_one_bg_color__hover_enabled=”off” button_two_bg_color__hover_enabled=”off”][/et_pb_fullwidth_header][/et_pb_section][et_pb_section fb_built=”1″ specialty=”on” _builder_version=”3.22.3″ custom_padding=”54px|0px|0|0px|false|false”][et_pb_column type=”3_4″ specialty_columns=”3″ _builder_version=”3.0.47″ parallax__hover=”off” parallax_method__hover=”on”][et_pb_row_inner _builder_version=”3.0.47″][et_pb_column_inner type=”4_4″ saved_specialty_column_type=”3_4″ _builder_version=”3.0.47″ parallax__hover=”off” parallax_method__hover=”on”][et_pb_text _builder_version=”3.0.74″ background_size=”initial” background_position=”top_left” background_repeat=”repeat”]

Starting with What Made Sense

So the Krypton Radio web site has to go full SSL now because most modern web browsers (read “Google Chrome”) won’t let people visit without warning them that your web site will slay your children in their sleep if you don’t have an SSL certificate on it.

This is frankly just Google messing with our heads, for the most part. A site that does not handle money shouldn’t have to worry about this. All the monetary things we need to do are handled by external sites that actually are secure. But I digress.

So our first assumption was that we could just buy a cert from secureserver.net, install it on Centova, Icecast and our main web server and we were probably good to go.

And then everything collapsed.

[/et_pb_text][/et_pb_column_inner][/et_pb_row_inner][et_pb_row_inner _builder_version=”3.24.1″][et_pb_column_inner type=”4_4″ saved_specialty_column_type=”3_4″][et_pb_text _builder_version=”3.24.1″]

What We Did First

I went to create our private key and Certificate Signing Request. After a few tries, I finally was able to use CPanel to generate this, adding in wildcard domains for every domain we wanted to cover. This is a completely legal thing, and you can buy one certificate to handle as many domains as you want. 

If you actually buy it through CPanel, though, you can’t. It’s one domain per cert, and $30 per cert. Buying it through your registrar, though, is a lot cheaper.  If you own ten domains, you can easily spend a bundle doing this, and there’s literally no reason for it. Shall we spend 10% of the cost Cpanel wants us to spend?

Yes. Yes we shall.

Mind you, the only reason we’re doing that is that when we started all this there was no such things as Let’s Encrypt, which is a free secure certificate signing company.

The only catch to certificates you get from them is that the certs expire after 90 days, so it’s kind of a problem if you want to use them with a mail server. Every three months your users will have to accept a new SSL certificate to get their email, and trust me, it wigs them out. Most people can barely operate the send button.

That Utterly Failed

No matter what we did with the certificates supplied to us by secureserver.net, Centovacast hated them. The installation routine provided by Centova (your installation will have it at /usr/local/centovacast/sbin/setssl) just barfs on it every time. 

The instructions provided by Centova say to get Apache credentials. This is wrong. You need credentials for something, but whatever it is, it wants a .pem file, and whatever is supposed to be IN that .pem file isn’t documented.

 

[/et_pb_text][/et_pb_column_inner][/et_pb_row_inner][et_pb_row_inner _builder_version=”3.0.47″][et_pb_column_inner type=”1_2″ saved_specialty_column_type=”3_4″ _builder_version=”3.0.47″ parallax__hover=”off” parallax_method__hover=”on”][et_pb_text _builder_version=”3.0.74″ background_size=”initial” background_position=”top_left” background_repeat=”repeat”]

What We Did First

I went to create our private key and Certificate Signing Request. After a few tries, I finally was able to use CPanel to generate this, adding in wildcard domains for every domain we wanted to cover. This is a completely legal thing, and you can buy one certificate to handle as many domains as you want. 

If you actually buy it through CPanel, though, you can’t. It’s one domain per cert, and $30 per cert. Buying it through your registrar, though, is a lot cheaper.  If you own ten domains, you can easily spend a bundle doing this, and there’s literally no reason for it. Shall we spend 10% of the cost Cpanel wants us to spend?

Yes. Yes we shall.

Mind you, the only reason we’re doing that is that when we started all this there was no such things as Let’s Encrypt, which is a free secure certificate signing company.

The only catch to certificates you get from them is that the certs expire after 90 days, so it’s kind of a problem if you want to use them with a mail server. Every three months your users will have to accept a new SSL certificate to get their email, and trust me, it wigs them out. Most people can barely operate the send button.

[/et_pb_text][/et_pb_column_inner][et_pb_column_inner type=”1_2″ saved_specialty_column_type=”3_4″ _builder_version=”3.0.47″ parallax__hover=”off” parallax_method__hover=”on”][et_pb_text _builder_version=”3.0.74″ background_size=”initial” background_position=”top_left” background_repeat=”repeat”]

That Utterly Failed

No matter what we did with the certificates supplied to us by secureserver.net, Centovacast hated them. The installation routine provided by Centova (your installation will have it at /usr/local/centovacast/sbin/setssl) just barfs on it every time. 

The instructions provided by Centova say to get Apache credentials. This is wrong. You need credentials for something, but whatever it is, it wants a .pem file, and whatever is supposed to be IN that .pem file isn’t documented.

 

[/et_pb_text][/et_pb_column_inner][/et_pb_row_inner][et_pb_row_inner _builder_version=”3.19.18″][et_pb_column_inner type=”4_4″ saved_specialty_column_type=”3_4″ _builder_version=”3.0.47″][et_pb_text _builder_version=”3.19.18″]

The Icecast Connection

So that’s when we figured out that Icecast, the Centova main panel , and WordPress all needed to be set up with certificates, and that not all of them were going to be able to use the same ones.

Here’s the instructions I found on how to do that for Icecast.

Note with interest that they’re talking about putting the private key, the public key, and the authority chain all in one file. I found a BBS topic on how this should be done, specifically with Let’s Encrypt.

The whole point of a private key is that it’s supposed to be private. Why are they asking you to do this??

[/et_pb_text][/et_pb_column_inner][/et_pb_row_inner][et_pb_row_inner custom_padding=”21.8594px|0px|0|0px|false|false” _builder_version=”3.19.18″][et_pb_column_inner type=”4_4″ saved_specialty_column_type=”3_4″ _builder_version=”3.0.47″][et_pb_text _builder_version=”3.19.18″]

The Centovacast Connection

I never got the certs I bought working with Centovacast, and self-signing isn’t an option, so I went ahead and asked the Centova Utility  at /usr/local/centovacast/sbin/setssl to create the certs for me using Let’s Encrypt.

To do that, you need to set up a directory alias on a web server on the same domain as Centovacast to serve up the validation files Let’s Encrypt needs to prove that you’re who you say you are.

The instructions say to use a specific block of code to define the directory alias that points to where those validation files are held on the server, but it says nothing about where in your Apache file to put them.

You’re going to need to set up your aliased directory so that the same domain that handles your Centova server is being served as a regular domain or subdomain on port 80, which is the standard port for serving web pages.

In my case, I had a subdirectory called ‘station’. I had to create a server alias so that that subdomain was included in the list of other servers my main vhost listing handles for me, so that station.kryptonradio.com and kryptonradio.com are really being handled by the same vhost. This saved me from having to set up a complete separate vhost just to handle this one fricking problem.

It also gives the incorrect code to insert in the first place. Forget what they say in their article. Here’s the correct code:

Alias /.well-known/acme-challenge /usr/local/centovacast/etc/ssl/acme-challenges

<Directory “/usr/local/centovacast/etc/ssl/acme-challenges”>
Options Indexes
AllowOverride None
Order allow,deny
Allow from all
Require all granted

# Apache 2.x
<IfModule !mod_authz_core.c>
Order allow,deny
Allow from all
</IfModule>

# Apache 2.4
<IfModule mod_authz_core.c>
Order allow,deny
Require all granted
</IfModule>
</Directory>

 

Big question: Why put broken code in a utility, and then write documentation that pretends it works? Again?

Centova is notorious for this.

When we fixed all of the above basic configuration with the Apache server to satisfy the needs of LetsEncrypt, we found that the setssl script was changing permissions on the target file folder such that it would return a 403 error. 

That’s right, the Centova utility script that installs the certificate intentionally breaks the process so that it can’t finish.

Insert the change in the chmod instruction that alters it from 750 to 755.

Change both of them or setssl crashes and burns. For some reason this bug has been in there forever, and Centova’s never fixed it:

[/et_pb_text][/et_pb_column_inner][/et_pb_row_inner][et_pb_row_inner custom_padding=”0|0px|21.8594px|0px|false|false” _builder_version=”3.19.18″][et_pb_column_inner type=”4_4″ saved_specialty_column_type=”3_4″ _builder_version=”3.0.47″][et_pb_text _builder_version=”3.19.18″]

if [ ! -e “$challengepath” ]; then
      mkdir -p “$challengepath”
fi

chown root.centovacast “$challengepath”
chmod 0755 “$challengepath”

testcontent=”test-$(date +%s).$$”
testfilename=”${testcontent}.txt”
echo “$testcontent” > “$challengepath/$testfilename”
chown root.centovacast “$challengepath/$testfilename”
chmod 0755 “$challengepath/$testfilename”

[/et_pb_text][/et_pb_column_inner][/et_pb_row_inner][/et_pb_column][et_pb_column type=”1_4″ _builder_version=”3.0.47″ parallax__hover=”off” parallax_method__hover=”on”][et_pb_sidebar orientation=”right” _builder_version=”3.0.74″][/et_pb_sidebar][/et_pb_column][/et_pb_section][et_pb_section fb_built=”1″ _builder_version=”3.22.3″ custom_padding=”0|0px|54px|0px|false|false”][et_pb_row _builder_version=”3.22.3″][et_pb_column type=”4_4″ _builder_version=”3.19.18″][et_pb_text _builder_version=”3.19.18″]

You’re Not Out of the Woods Yet

It’s not enough to get Centova itself running on an SSL certificate. Now you have to get IceCast itself working with SSL, which for some reason is a separate task, and any attempt to link to an unsecured stream from a secured site will make web browsers claim your site is not secure, thereby defeating the whole point of having a certificate in the first place.

 

So the trick here is, you will probably have to create a new listen socket beyond your default. Centova, by default, set you up on port 8000. I had to create a new secure port, so I moved it well up out of the way, on port 8080. All the mount points are available on both ports, but you can’t have one port be both secured and unsecured.

Your Icecast config isn’t called icecast.xml in a Centova installation. It’s called server.conf, and it’s also in a nonstandard location, which is /usr/local/var/vhosts/<your station name>/etc/server.conf.

Here are the listen socket sections from my server.conf.  It’s the top one you’re looking at. The bottom one is the default definition, and the top one is the secure one. Centova does not support the direct creation of secure listen sockets, so you have to hack this by hand.

<listen-socket>
<port>8080</port>
<ssl>1</ssl>
</listen-socket>

 

 

 

 

<listen-socket>
<port>8000</port>
</listen-socket>

Once this is done, you can go to the Centova interface and reload the server, and it will inhale the new settings. You can test them to make sure it worked by going to https://<yourdomain>:8080 and seeing if it loads. If it doesn’t, you’re still broken, but if it does, congratulations, you now have a secure stream on your internet radio station’s business end!

 

 

 

 

[/et_pb_text][/et_pb_column][/et_pb_row][/et_pb_section]

What do you think?

Leave a Reply

Your email address will not be published. Required fields are marked *