As far as the code is concerned, there is no such thing as a checkpoint key. The so-called checkpoint key, as far as I know, is just the signing key that allows people to check diffs into the Github repository. So that
is just a hosting issue. A new checkpoint is just a one-line addition to the source code, not something that the program auto-updates in response to a signed message that it has to know a key for. Allowing a signed message to automagically add a checkpoint to running clients is interesting - and a fairly straightforward hack - but is probably a bad idea.
With that mechanism the dev could send out a new checkpoint at any time. The good news is that it would be a way to resolve forks or "unstick" a stuck block chain by checkpointing one of the competing branches or the last orphan block prior to whatever it got stuck on. The bad news is that it would give the dev power to undo any transaction on demand by rolling back the block chain. All he'd have to do would be mine one block based on the block before the tx he wants to undo, with a tx spending at least one of its inputs. Then publish the "new" block and checkpoint it. Suddenly the block chain containing the other tx, even if now many blocks longer, is invalid. Poof, the dev has the power to double spend. And if he undoes a bunch of blocks this way, everybody else who's spent something they want to "unspend" would get at least a chance to do the same.
You do have a point about the alert key though - and unless you want to gift your coinbase txOut to the "Spirit of Satoshi" you'll want to generate a coinbase txOut key as well.
openssl ecparam -genpkey -name secp256k1 -out key.pem
will drop a public/private keypair in the file key.pem.
The public key in that file is in hex format, with a semicolon between bytes. Strip the semicolons and linefeeds out of it, and you can paste it directly in as the vAlertPubKey (still in chainparams.cpp). That makes the private key of the pair the one you need to sign alerts to send out to the whole network. So save that private key somewhere you won't lose it.
Next the coinbase key.
You can repeat the command line above to generate another key pair, then strip the semicolons and linefeeds out of THAT public key, go to the initializer for CMainParams and replace the key in the "txNew.vOut[0].scriptPubKey with the hexadecimal string for the new public key.
Then the corresponding private key would be the one you need to spend the coinbase transaaction. The coinbase transaction won't appear in any wallet by default, because no wallets exist yet at the time the transaction gets created. So if you ever want to spend the coinbase, you have to keep that private key. Convert it into base58check format, and you'll have a key you can later import into your wallet.
Converting into base58check is annoying, but do-able. Rather than explain it, I'm going to point at
https://en.bitcoin.it/wiki/Base58Check_encoding. Keep in mind that your keys use a different version byte than the Bitcoin keys though.
That means you changed the coinbase transaction though, so you'll have changed the Merkle root of the genesis block, so your hashes (for mainnet and testnet) won't be valid any more.
To fix this, you'll need to do
Then mine the genesis blocks again.
Man, this is getting to be more than twelve steps, isn't it? Maybe I'll need to do a full-on guide.